我如何总结一个只有特定值计数的 Dataframe ,以生成一个带有pandas的分组表?

nnvyjq4y  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(109)

请考虑以下玩具数据:

dat = pd.DataFrame({'Year': [1,1,1,1,1,2,2,2,2,2],
                'Type': ['a','a','b','b','b','a','a','a','b','b'],
                'Status': ['ft','ft','ft','pt','pt','ft','ft','ft','ft','pt']})

我有兴趣创建一个汇总表,按年份分组,其中列根据我选择的字符串指定持有计数。例如,我想要一个如下所示的表:

result = pd.DataFrame({'Year': [1,2],
                   'Type_B_Count': [3,2],
                   'Status_FT_Count': [3,4]})

在R世界中,我会使用dplyr并得到我想要的结果:

result<-dat%>%
  group_by(Year)%>%
  summarise(Type_B_Count=sum(Type %in% c("b")),
            Status_FT_Count=sum(Status %in% c("ft")))

理想情况下,我希望得到一个通用的答案,这样我就可以将代码转换为字符串搜索,而不会有太多的变化。

result<-dat%>%
      group_by(Year)%>%
      summarise(Type_B_Count=sum(grepl("b",Type)),
                Status_FT_Count=sum(Status %in% c("ft")))


我已经看到了几个答案,似乎提供了感兴趣的变量的所有水平/组合的计数,但还没有找到这个特定问题的解决方案。
我可以想象类似的问题会经常被问到,但到目前为止还没有找到任何产生这种输出的结果,我在这里。任何关于这个问题的帮助/指导我正在寻找的信息将不胜感激。

2w2cym1i

2w2cym1i1#

一个自定义聚合选项(groupby.agg):

out = (
 dat.groupby('Year', as_index=False)
    .agg(**{'Type_B_Count': ('Type', lambda g: g.eq('b').sum()),
            'Status_FT_Count': ('Status', lambda g: g.eq('ft').sum())
         })
)

或者:

from functools import partial

def count(g, item=None):
    return g.eq(item).sum()

out = (
 dat.groupby('Year', as_index=False)
    .agg(**{'Type_B_Count': ('Type', partial(count, item='b')),
            'Status_FT_Count': ('Status', partial(count, item='ft'))
         })
)

输出:

Year  Type_B_Count  Status_FT_Count
0     1             3                3
1     2             2                4

另一个使用字典的选项:

d = {'Type': 'b', 'Status': 'ft'}

out = (
 dat.set_index('Year')
    .eq(d)
    .groupby(level=0).sum()
    .rename(columns=lambda col: f'{col}_{d[col]}_Count')
    .reset_index()
)

输出:

Year  Type_b_Count  Status_ft_Count
0     1             3                3
1     2             2                4

相关问题