gpt4 book ai didi

python - 如何将多个函数应用于 groupby 对象

转载 作者:太空狗 更新时间:2023-10-30 00:01:30 24 4
gpt4 key购买 nike

例如,我有两个 lambda 函数应用于分组数据框:

df.groupby(['A', 'B']).apply(lambda g: ...)
df.groupby(['A', 'B']).apply(lambda g: ...)

两者都可以,但结合起来就不行了:

df.groupby(['A', 'B']).apply([lambda g: ..., lambda g: ...])

这是为什么呢?如何将不同的函数应用于分组对象并将每个结果按列串联在一起?

有没有办法不为函数指定某些列?您所建议的所有内容似乎只适用于某些列。

最佳答案

这是一个很好的机会来强调 pandas 0.20 的变化之一

Deprecate groupby.agg() with a dictionary when renaming

这是什么意思?
考虑数据框 df

df = pd.DataFrame(dict(
A=np.tile([1, 2], 2).repeat(2),
B=np.repeat([1, 2], 2).repeat(2),
C=np.arange(8)
))
df

A B C
0 1 1 0
1 1 1 1
2 2 1 2
3 2 1 3
4 1 2 4
5 1 2 5
6 2 2 6
7 2 2 7

我们以前可以做

df.groupby(['A', 'B']).C.agg(dict(f1=lambda x: x.size, f2=lambda x: x.max()))

f1 f2
A B
1 1 2 1
2 2 5
2 1 2 3
2 2 7

还有我们的名字'f1''f2'被放置为列标题。但是,对于 pandas 0.20,我得到了这个

//anaconda/envs/3.6/lib/python3.6/site-packages/ipykernel/__main__.py:1: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version
if __name__ == '__main__':

那是什么意思呢?如果我做两个 lambdas 会怎样没有命名字典?

df.groupby(['A', 'B']).C.agg([lambda x: x.size, lambda x: x.max()])

---------------------------------------------------------------------------
SpecificationError Traceback (most recent call last)
<ipython-input-398-fc26cf466812> in <module>()
----> 1 print(df.groupby(['A', 'B']).C.agg([lambda x: x.size, lambda x: x.max()]))

//anaconda/envs/3.6/lib/python3.6/site-packages/pandas/core/groupby.py in aggregate(self, func_or_funcs, *args, **kwargs)
2798 if hasattr(func_or_funcs, '__iter__'):
2799 ret = self._aggregate_multiple_funcs(func_or_funcs,
-> 2800 (_level or 0) + 1)
2801 else:
2802 cyfunc = self._is_cython_func(func_or_funcs)

//anaconda/envs/3.6/lib/python3.6/site-packages/pandas/core/groupby.py in _aggregate_multiple_funcs(self, arg, _level)
2863 if name in results:
2864 raise SpecificationError('Function names must be unique, '
-> 2865 'found multiple named %s' % name)
2866
2867 # reset the cache so that we

SpecificationError: Function names must be unique, found multiple named <lambda>

在名为 '<lambda>' 的多个列上出现 pandas 错误

解决方案:为您的函数命名

def f1(x):
return x.size

def f2(x):
return x.max()

df.groupby(['A', 'B']).C.agg([f1, f2])

f1 f2
A B
1 1 2 1
2 2 5
2 1 2 3
2 2 7

关于python - 如何将多个函数应用于 groupby 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44332002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com