2016-07-27 149 views
2

如果我有一个简单的表格,如:先进的聚集大熊猫蟒蛇

index location  col1 col2 col3 col4 
    1   a  TRUE yes  1  4 
    2   a FALSE null  2  6 
    3   b  TRUE null  6  3 
    4   b  TRUE  no  3  4 
    5   b FALSE yes  4  6 
    6   c  TRUE  no  57  8 
    7   d FALSE null  74  9 

如果我想聚集在位置重复的记录,即两个A或三个B的,我一直在使用一个基本groupby函数。这适用于简单的表格。

但是,是否可以扩展此功能,以便在聚合时允许每列的规则?作为col1的一个例子,如果TRUE存在,它会胜过任何FALSE值,或者在col3中,它会对这些值进行求和,而在col4中它会计算平均值?是否可以为每列定义这些规则,然后在使用groupby时应用它们?

我在网上搜索,但没有发现任何似乎覆盖这个,但我可能会吠叫错误的树。

谢谢。

+0

您可以发布想要的/预期的数据集吗? – MaxU

回答

4

使用groupbyagg

funcs = dict(
    col1=dict(Trump=lambda x: x.any()), 
    col3='sum', 
    col4=dict(Avg='mean') 
) 

df.groupby('location').agg(funcs) 

enter image description here


当与多个列groupby对象上使用agg,可以传递一个dict定义适用于哪一列,其功能。

在这个高级字典(funcs)中,键是应用在该值中定义的函数的现有列名称。

例如:

agg({'col1': lambda x: x.any(), 'col2': 'sum'}) 

说对col2col1sum使用any()。如果数据帧中不存在col1col2,则会失败。

此外,我们不必使用来自此聚合的默认列名称。我将运行上面的小例子来说明。

df.groupby('location').agg({'col1': lambda x: x.any(), 'col3': 'sum'}) 

enter image description here

没有太多说明什么,我们已经做到了。如果我们将字典作为函数传递,我们可以根据需要描述函数,关键是描述,值是函数。我将使用相同的示例,但用更好的描述进行扩展。

df.groupby('location').agg(
    {'col1': {'All I need is one True': lambda x: x.any()}, 
    'col3': {'SUMMATION': 'sum'}}) 

enter image description here

武装与信息,希望我的解决方案是非常合情合理的。

+0

++用于阅读; – MaxU

+0

@MaxU谢谢:-) – piRSquared

+0

@piRSquared多么美妙的答案!感谢您抽出时间! :d – DGraham