Pandas按两列groupby后分别统计两列value_counts输出为不同列的方法
解决方案
问题分析
你原代码的问题有两个:
- 同时选中两列传入
apply处理,返回的统计结果会合并到同一列,无法拆分出两个独立统计列 - 直接对列表类型列使用
astype('str')会把整个列表转为单个字符串统计,无法统计列表内部单个元素的出现次数
实现代码
首先构造示例DataFrame:
import pandas as pd data = {'label': ['cat','dog','dog','cat','cat'], 'breeds': [ 'bengal','shar pei','pug','maine coon','maine coon'], 'nicknames':[['Loki','Loki' ],['Max'],['Toby','Zeus ','Toby'],['Marty'],['Erin ','Erin']], 'eye color':[['blue','green'],['green'],['brown','brown','brown'],['blue'],['green','brown']] } df = pd.DataFrame(data)
使用agg方法为每个列单独指定聚合逻辑,先拆分列表元素再统计:
result = df.groupby(['label', 'breeds'], as_index=False).agg( nickname_count = ('nicknames', lambda x: x.explode().str.strip().value_counts().to_dict()), eye_count = ('eye color', lambda x: x.explode().str.strip().value_counts().to_dict()) )
补充说明
如果需要保留元素首尾的空格作为不同值区分,删除聚合逻辑中的.str.strip()即可。
内容的提问来源于stack exchange,提问作者Rory
相关产品推荐
相关产品推荐

