[英]Select slices/ range of columns for each row in a pandas dataframe
這是問題所在:
import numpy
import pandas
dfl = pandas.DataFrame(numpy.random.randn(30,10))
現在,我希望將以下單元格放入數據框中:
這些范圍中的每一個總是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
或者我們可以使用.iloc
並enumerate
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.