2016-08-12 91 views
0

我有我運行一個數據幀:如何使用pandas groupby&aggregate生成新列?

df.groupby(by="mycol").agg({"colA": "sum", "colB": "count"}) 

然而,colAcolB有存在的必要。從聚合創建新列的最「熊貓」方法是什麼?

編輯:

基本上,我有一組列的和我的聚集不是1:1的映射。因此,請考慮一個例子,我想將兩列值的比率作爲新列彙總。現在想一下這種映射的字典。

我知道在這個例子中,我只需要篩選play,然後計算分組數據的平均值。但這不是問題的關鍵,所以請忽略這個簡單的解決方案,這只是簡單示例的副作用。

>> df 
    outlook play temperature 
0  sunny True   25 
1  sunny True   25 
2 overcast True   19 
3  rain False   21 
4 overcast False   33 
5  rain False   27 
6  rain False   22 
7 overcast True   26 
8  sunny True   13 
9  sunny True   16 

# should become: 
>> df.groupby(by="outlook").agg(?) 
     play_mean_temp 
sunny 19.75 
overcast 22.50 
rain  NaN 
+0

你需要'df.groupby(通過=「mycol 「).agg(['sum','count'])'? – jezrael

+0

您可以添加數據和期望輸出的樣本嗎? – jezrael

+0

@jezrael根據需要添加。感謝您的幫助! – Xiphias

回答

1

在您的樣品,你可以使用:

print (df.groupby(by="outlook").apply(lambda x: x.ix[x.play, 'temperature'].mean())) 
outlook 
overcast 22.50 
rain   NaN 
sunny  19.75 

如果首先使用索引布爾,一些行忽略:

print (df[df.play].groupby(by="outlook")['temperature'].mean()) 
outlook 
overcast 22.50 
sunny  19.75 
Name: temperature, dtype: float64 
+0

太棒了。還有一件事:如果我有兩個聚合,我將如何讓他們進入一個DataFrame?你在這裏給我一個系列,但假設我有兩個來自相同原始數據的聚合。我會怎麼做? – Xiphias

+1

然後你可以使用自定義函數並返回新的'DataFrame',參見[docs](http://pandas.pydata.org/pandas-docs/stable/groupby.html#flexible-apply)。 – jezrael

+1

我想'在[117]'在'docs.' – jezrael