[英]Pandas group by aggregate using division
我想知道如何通過一個函數聚合分組的pandas數據幀中的數據,其中我考慮了存儲在數據幀的某些列中的值。 這對於操作順序很重要的操作很有用,例如划分。
例如,我有:
In [8]: df
Out[8]:
class cat xer
0 a 1 2
1 b 1 4
2 c 1 9
3 a 2 6
4 b 2 8
5 c 2 3
我希望按類進行分組,並且每個class
將cat == 1
的xer
值除以cat == 2
。 換句話說,最終輸出中的條目應為:
class div
0 a 0.33 (i.e. 2/6)
1 b 0.5 (i.e. 4/8)
2 c 3 (i.e. 9/3)
這可以用groupby嗎? 我不知道如何在沒有手動迭代每個類的情況下完成它,即使這樣也不干凈或有趣。
沒有做任何太聰明的事情:
In [11]: one = df[df["cat"] == 1].set_index("class")["xer"]
In [12]: two = df[df["cat"] == 2].set_index("class")["xer"]
In [13]: one / two
Out[13]:
class
a 0.333333
b 0.500000
c 3.000000
Name: xer, dtype: float64
給定您的DataFrame
,您可以使用以下內容:
df.groupby('class').agg({'xer': lambda L: reduce(pd.np.divide, L)})
哪個給你:
xer
class
a 0.333333
b 0.500000
c 3.000000
這適合每組> 2(如果需要),但您可能希望確保您的df首先按cat
排序,以確保它們以正確的順序出現。
這是一種一步一步的方法:
# get cat==1 and cat==2 merged by class
grouped = df[df.cat==1].merge(df[df.cat==2], on='class')
# calculate div
grouped['div'] = grouped.xer_x / grouped.xer_y
# return the final dataframe
grouped[['class', 'div']]
產量:
class div
0 a 0.333333
1 b 0.500000
2 c 3.000000
您可能需要重新排列數據以便於查看:
df2 = df.set_index(['class', 'cat']).unstack()
>>> df2
xer
cat 1 2
class
a 2 6
b 4 8
c 9 3
然后,您可以執行以下操作以獲得所需的結果:
>>> df2.iloc[:,0].div(df2.iloc[:, 1])
class
a 0.333333
b 0.500000
c 3.000000
Name: (xer, 1), dtype: float64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.