2014-10-01 20 views
0

這種情況困於此,所以希望有人可以提供幫助。一般來說,我有這樣的Python pandas在所有重複的ID中均勻地分割行值

df = pd.DataFrame({ 
      "id": [1,1,1,4,5,5,7], 
      "value": [100, 100, 100, 45, 3, 3, 42] 
      }) 

一個數據幀是我想要做的是每個副本ID爲每個行平分價值,並跟蹤有多少是被分裂了新的變數。所以我的理想輸出是這樣的

id value value2  people 
1 100  33.333333 0.333333 
1 100  33.333333 0.333333 
1 100  33.333333 0.333333 
4 45  45.000000 1 
5 3  1.500000 0.500000 
5 3  1.500000 0.500000 
7 42  42.000000 1 

我已經這樣做得到值2:

df['value2'] = df.groupby(['id'])['value'].apply(lambda x: x/len(x)) 

但沒有與人柱運氣:(我最初試圖:

df['people'] = df.groupby(['id']).apply(lambda x: 1./len(x)) 

這是接近,但缺少的東西

回答

1

最簡單的方法是將一個專欄的groupby(無關緊要),並且使用transform而不是apply,就像這樣。

df['people'] = df.groupby(['id'])['value'].transform(lambda x: 1./len(x)) 

這樣做沒有,而你的第一個作品的原因是你的函數返回一個值,而不是值的數組,所以transform廣播回到原來的框架的形狀,而apply更加靈活,通常會返回你的函數返回的任何形狀。