簡體   English   中英

為熊貓數據框中的每一行選擇切片/列范圍

[英]Select slices/ range of columns for each row in a pandas dataframe

這是問題所在:

import numpy
import pandas

dfl = pandas.DataFrame(numpy.random.randn(30,10))

現在,我希望將以下單元格放入數據框中:

  • 對於第1行:第3至6列(長度= 4個單元格),
  • 對於第2行:第4至7列(長度= 4個單元格),
  • 對於第3行:第1到4列(長度= 4個單元格),
  • 等...

這些范圍中的每一個總是4個單元格寬,但是開始/結束是不同的列。

行起始點在列表[3, 4, 1,...]中,行終止點也在列表中。 我感興趣的行列表也是列表[1, 2, 3]

最后, dfl有一個我想保留的datetime-index(意味着最終結果應該是帶有索引dfl.index[1, 2, 3]的數據幀。

編輯:范圍超出

行起點的向量的某些條目太大(例如,在上面的示例矩陣中,行起點為9)。 在那種情況下,我只希望從行開始的所有列開始,然后想要盡可能多的NaN以獲得正確的形狀(因此,由於9+4 > 10 ,結果數據幀的對應行應為[9, 10, NaN, NaN]

使用NumPy broadcasting創建所有這些列索引,然后對數組數據進行advanced-indexing -

def extract_rows(dfl, starts, L, fillval=np.nan):
    a = dfl.values

    idx = np.asarray(starts)[:,None] + range(L)
    valid_mask = idx < dfl.shape[1]
    idx[~valid_mask] = 0

    val = a[np.arange(len(idx))[:,None],idx]
    return pd.DataFrame(np.where(valid_mask, val, fillval))

樣品運行-

In [541]: np.random.seed(0)

In [542]: dfl = pandas.DataFrame(numpy.random.randint(11,99,(3,10)))

In [543]: dfl
Out[543]: 
    0   1   2   3   4   5   6   7   8   9
0  55  58  75  78  78  20  94  32  47  98
1  81  23  69  76  50  98  57  92  48  36
2  88  83  20  31  91  80  90  58  75  93

In [544]: extract_rows(dfl, starts=[3,4,8], L=4, fillval=np.nan)
Out[544]: 
      0     1     2     3
0  78.0  78.0  20.0  94.0
1  50.0  98.0  57.0  92.0
2  75.0  93.0   NaN   NaN

In [545]: extract_rows(dfl, starts=[3,4,8], L=4, fillval=-1)
Out[545]: 
    0   1   2   3
0  78  78  20  94
1  50  98  57  92
2  75  93  -1  -1

或者我們可以使用.ilocenumerate

l=[3, 4, 1]
pd.DataFrame(data=[df.iloc[x:x+1,y:y+4].values[0] for x,y in enumerate(l)])
Out[107]: 
          0         1         2         3
0  1.224124 -0.938459 -1.114081 -1.128225
1 -0.445288  0.445390 -0.154295 -1.871210
2  0.784677  0.997053  2.144286 -0.179895

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM