2017-07-19 181 views
5

所以,我正在學習熊貓,我有這個問題。熊貓更新列與陣列

假設我有一個這樣的數據幀:

A B C 
1 x NaN 
2 y NaN 
3 x NaN 
4 x NaN 
5 y NaN 

我試圖創建此:基於B相似

A B C 
1 x [1,3,4] 
2 y [2,5] 
3 x [1,3,4] 
4 x [1,3,4] 
5 y [2,5] 

我這樣做:

teste = df.groupby(['B']) 
for name,group in teste: 
    df.loc[df['B'] == name[0],'C'] = group['A'].tolist() 

而且我得到了這一點。像C列一樣是基於A列的。

A B C 
1 x 1 
2 y 2 
3 x 3 
4 x 4 
5 y 5 

任何人都可以向我解釋爲什麼會發生這種情況,並以我想要的方式做到這一點? 謝謝:)

回答

6

您可以根據列做首先聚集,然後加入回來原來的DF上B

df 
# A B 
#0 1 x 
#1 2 y 
#2 3 x 
#3 4 x 
#4 5 y 

df.groupby('B').A.apply(list).rename('C').reset_index().merge(df) 

# B   C A 
#0 x [1, 3, 4] 1 
#1 x [1, 3, 4] 3 
#2 x [1, 3, 4] 4 
#3 y  [2, 5] 2 
#4 y  [2, 5] 5 
+0

運行此產生錯誤:類型錯誤:unhashable類型:「名單」 –

+0

@ E.Ducateme您需要刪除'C'柱和嘗試。 – ayhan

+0

其實,這工作,而不是我標記爲答案的其他解決方案:) –

0
test = df.groupby('B')['A'].apply(list) 
4

你可以使用transform創建列表。

In [324]: df['C'] = df.groupby('B')['A'].transform(lambda x: [x.values]) 

In [325]: df 
Out[325]: 
    A B   C 
0 1 x [1, 3, 4] 
1 2 y  [2, 5] 
2 3 x [1, 3, 4] 
3 4 x [1, 3, 4] 
4 5 y  [2, 5] 
+0

工作!非常感謝! :) –

1

總結創意!
製作A單值列表。然後使用sum進行轉換。

df.assign(
    C=pd.Series(
     df.A.values[:, None].tolist(), df.index 
    ).groupby(df.B).transform('sum') 
) 

    A B   C 
0 1 x [1, 3, 4] 
1 2 y  [2, 5] 
2 3 x [1, 3, 4] 
3 4 x [1, 3, 4] 
4 5 y  [2, 5]