賦予了新的列在數據幀由列出以下DataFrame
:創建使用熊貓
t
0 3
1 5
我想創建一個新的列,其中WACH條目是一個列表,它是該行的一個功能是特別是它應該有一個列表,其中所有正整數不得大於t
列中的條目。所以輸出應該是:
t newCol
0 3 [1,2,3]
1 5 [1,2,3,4,5]
換句話說,我想申請list(range(1,t+1))
到每一行。我知道如何在循環中做到這一點,但有很長的DataFrame
,所以我正在尋找速度。謝謝。
賦予了新的列在數據幀由列出以下DataFrame
:創建使用熊貓
t
0 3
1 5
我想創建一個新的列,其中WACH條目是一個列表,它是該行的一個功能是特別是它應該有一個列表,其中所有正整數不得大於t
列中的條目。所以輸出應該是:
t newCol
0 3 [1,2,3]
1 5 [1,2,3,4,5]
換句話說,我想申請list(range(1,t+1))
到每一行。我知道如何在循環中做到這一點,但有很長的DataFrame
,所以我正在尋找速度。謝謝。
下面是使用NumPy
方法量化的方法 -
a = df.t.values
idx = a.cumsum()
id_arr = np.ones(idx[-1],dtype=int)
id_arr[idx[:-1]] = -a[:-1]+1
df['newCol'] = np.split(id_arr.cumsum(),idx[:-1])
採樣運行 -
In [76]: df
Out[76]:
t newCol
0 4 [1, 2, 3, 4]
1 3 [1, 2, 3]
2 7 [1, 2, 3, 4, 5, 6, 7]
3 2 [1, 2]
4 5 [1, 2, 3, 4, 5]
5 3 [1, 2, 3]
是這樣的話非常接近@ Divakar的答案,但我相信一個稍微有點更加直觀。
更快numpy的訪問獲取值
v = df.t.values
[3 5]
得到v
cumsum = v.cumsum()
[3 8]
累積和得到一些二fferences
用於跟蹤拆分,並採取差異後
diffs = cumsum - v
[0 3]
編譯一個大的累積和
這是最終值的起點
prevals = np.ones(cumsum[-1], dtype=int).cumsum()
[1 2 3 4 5 6 7 8]
終於,分裂並放
df['new_col'] = np.split(prevals - np.repeat(diffs, v), diffs[1:])
一起
df = pd.DataFrame(dict(t=[4, 3, 7, 2, 5, 3]))
v = df.t.values
cumsum = v.cumsum()
diffs = cumsum - v
prevals = np.ones(cumsum[-1], dtype=int).cumsum()
df['new_col'] = np.split(prevals - np.repeat(diffs, v), diffs[1:])
'DF [ 'NEWCOL'] = df.t.map(np.arange)+ 1' – MaxU