gpt4 book ai didi

python - Pandas groupby : counting rows satisfying condition on other columns?

转载 作者:太空宇宙 更新时间:2023-11-04 02:07:37 26 4
gpt4 key购买 nike

我想在 pandas 中做一个 groupby 作为结果得到一个数据框,该数据框的列是用于 groupby 的列,每个组和之间的元素数量它们,每个组中的元素数量,基于另一列值满足/不满足条件的元素数量。

例如像这样输入:

type    success
A True
B False
A False
C True

我想要这样的东西:

type    total    numOfSuccess numOfFailure
A 2 1 1
B 1 0 1
C 1 1 0

在 pyspark 中我是这样做的

import pyspark.sql.functions as F
df = df.groupBy("type").agg(\
F.count('*').alias('total'), \
F.sum(F.when(F.col('success')=="true", 1).otherwise(0)).alias('numOfSuccess'),
F.sum(F.when(F.col('success')!="true", 1).otherwise(0)).alias('numOfFails'))

在 pandas 中我只能得到 totalnumOfSuccess 为:

df_new = df.groupby(['type'], as_index=False)['success'].agg({'total':'count', 'numOfSuccess':'sum'})

或仅合计为:

df = df.groupby(['type']).size().reset_index(name='NumOfReqs')

但我无法获得第三列 numOfFailures 并且如果有替代方案而不是对 bool 值求和,那会更好,因为我认为 in 可以扩展到其他情况也更容易.

我该怎么做?

最佳答案

使用groupbyGroupBy.size计算所有数据,然后计算每个类别需要旋转 - 使用 GroupBy.sizeunstack , crosstabpivot_table :

df1 = df.groupby('type').size().reset_index(name='count')
df2 = (df.groupby(['type', 'success']).size().unstack(fill_value=0)
.rename(columns={True:'numOfSuccess', False:'numOfFails'}))

df2 的替代方法:

df2 = pd.crosstab(df['type'], df['success'])
.rename(columns={True:'numOfSuccess', False:'numOfFails'}))

或者:

df2 = (df.pivot_table(index='type', columns='success', fill_value=0, aggfunc='size')
.rename(columns={True:'numOfSuccess', False:'numOfFails'}))

df_new = df1.join(df2, on='type')
print (df_new)
type count numOfFails numOfSuccess
0 A 2 1 1
1 B 1 1 0
2 C 1 0 1

另一种解决方案是在 crosstab 中使用参数 margins并通过索引 iloc 删除最后一行:

df = (pd.crosstab(df['type'], df['success'], margins=True)
.rename(columns={True:'numOfSuccess', False:'numOfFails', 'All':'count'})
.iloc[:-1]
.reset_index()
.rename_axis(None, axis=1))

print (df)
type numOfFails numOfSuccess count
0 A 1 1 2
1 B 1 0 1
2 C 0 1 1

编辑:如果 TrueFalse 可能不存在,请添加 reindex添加缺失的列:

print (df)
type success
0 A True
1 B True
2 A True
3 C True

df1 = df.groupby('type').size().reset_index(name='count')
df2 = (df.groupby(['type', 'success']).size().unstack(fill_value=0)
.reindex(columns=[True, False], fill_value=0)
.rename(columns={True:'numOfSuccess', False:'numOfFails'}))


df_new = df1.join(df2, on='type')
print (df_new)
type count numOfSuccess numOfFails
0 A 2 2 0
1 B 1 1 0
2 C 1 1 0

关于python - Pandas groupby : counting rows satisfying condition on other columns?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54307039/

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