gpt4 book ai didi

python - 如何使用多列的值计数按组汇总 pandas DataFrame?

转载 作者:行者123 更新时间:2023-12-05 02:54:04 27 4
gpt4 key购买 nike

如果这是骗局,请指路。我 checked几个questions那来了close但没有解决我的问题。

我有一个虚拟的 DataFrame 如下:

   grp  Ax  Bx  Ay  By  A_match  B_match
0 foo 3 2 2 2 False True
1 foo 2 1 1 0 False False
2 foo 4 3 0 3 False True
3 foo 4 3 1 4 False False
4 foo 4 4 3 0 False False
5 bar 3 0 3 0 True True
6 bar 3 4 0 3 False False
7 bar 1 2 1 2 True True
8 bar 1 3 4 1 False False
9 bar 1 1 0 3 False False

我的目标是比较 AB 列,并通过 grp 总结结果:

           A_match       B_match      
False True False True
grp
bar 3 2 3 2
foo 5 0 3 2

所以我添加了两个 _match 列如下,得到上面的 df:

df['A_match'] = df['Ax'].eq(df['Ay'])
df['B_match'] = df['Bx'].eq(df['By'])

根据我的理解,我希望我能做这样的事情,但它不起作用:

df.groupby('grp')[['A_match', 'B_match']].agg(pd.Series.value_counts)

# trunc'd Traceback:
# ... ValueError: no results ...
# ... During handling of the above exception, another exception occurred: ...
# ... ValueError: could not broadcast input array from shape (5,7) into shape (5)

在我的实际数据中,我能够通过以一种相当不令人满意的方式强制 _matches 为 pd.Categorical 来回避这一点。但是,我已经注意到了断断续续的成功,即使有了这个虚拟数据,即使使用 pd.Categorial,我也会得到与上面完全相同的错误:

df['A_match'] = pd.Categorical(df['Ax'].eq(df['Ay']).values, categories=[True, False])
df['B_match'] = pd.Categorical(df['Bx'].eq(df['By']).values, categories=[True, False])
df.groupby('grp')[['A_match', 'B_match']].agg(pd.Series.value_counts)

# ... ValueError: could not broadcast input array from shape (5,7) into shape (5)

这对我来说毫无意义 - 形状 (5, 7) 甚至来自哪里?我上次检查时,每个 agg 都会传递一个形状 (5,)。甚至 agg 的运行方式似乎也与我想象的不同,它应该针对 Series 运行:

>>> df.groupby('grp')[['A_match', 'B_match']].agg(lambda x: type(x))
A_match B_match
grp
bar <class 'pandas.core.series.Series'> <class 'pandas.core.series.Series'>
foo <class 'pandas.core.series.Series'> <class 'pandas.core.series.Series'>

# Good - it's Series, I should be able to call value_counts directly?

>>> df.groupby('grp')[['A_match', 'B_match']].agg(lambda x: x.value_counts())

# AttributeError: 'DataFrame' object has no attribute 'value_counts' <-- ?!?!? Where did 'DataFrame' come from?

我最终能够使用以下组合,但仍然不太令人满意,因为它引入了很多不必要的 axis 名称。

>>> df.melt(id_vars='grp', value_vars=['A_match', 'B_match']).reset_index().pivot_table(index='grp', columns=['variable', 'value'], aggfunc=pd.Series.count)
index
variable A_match B_match
value False True False True
grp
bar 3 2 3 2
foo 5 0 3 2

这两种方法似乎都比较人为地实现了一些应该相对常见的用法。我想我的问题是,我是否忽略了这里明显的东西?

最佳答案

你可以在字典上agg:

(df.groupby('grp').agg({'A_match':'value_counts',
'B_match':'value_counts'})
.unstack(-1, fill_value=0)
)

输出:

      A_match       B_match      
False True False True
bar 3.0 2.0 3 2
foo 5.0 NaN 3 2

关于python - 如何使用多列的值计数按组汇总 pandas DataFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61968372/

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