繁体   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