2016-11-13 132 views
3

賦予了新的列在數據幀由列出以下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,所以我正在尋找速度。謝謝。

+1

'DF [ 'NEWCOL'] = df.t.map(np.arange)+ 1' – MaxU

回答

2

下面是使用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] 
1

是這樣的話非常接近@ 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:])
enter image description here


一起

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:])