簡體   English   中英

大熊貓集團利用分裂

[英]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

我希望按類進行分組,並且每個classcat == 1xer值除以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM