如何将含标签式列表的Pandas数据集转换为可使用agg等方法的groupby对象?
如何将含标签式列表的Pandas数据集转换为可使用agg等方法的groupby对象?
嗨,你遇到的问题我太懂了——直接按tags列分组时,Pandas会把整个列表当成一个分组键,完全不是我们想要的按单个标签分组的效果对吧?其实有个超简单的办法,用Pandas的explode方法就能完美解决,还能直接得到标准的groupby对象,支持agg、mean这些你需要的操作!
具体步骤走一遍:
首先先还原你的数据集:
import pandas as pd data = { 'Id': ['item1', 'item2', 'item3', 'item4'], 'tags': [['friends','family'], ['friends'], [], ['family','holiday']] } df = pd.DataFrame(data)
第一步:拆分标签列表
用explode('tags')把每个列表里的标签拆成单独的行,这样每个标签就和原数据的行一一对应了:
exploded_df = df.explode('tags')
拆分后的结果长这样:
Id tags 0 item1 friends 0 item1 family 1 item2 friends 2 item3 NaN 3 item4 family 3 item4 holiday
第二步:过滤空标签+分组操作
因为原数据里有个空列表(item3),拆分后会生成NaN,我们先把这些空值去掉,再按tags分组,就能得到你想要的统计结果了:
# 过滤空标签,按tags分组统计Id的数量 result = exploded_df.dropna(subset=['tags']).groupby('tags').count() # 重命名列让结果更直观,再重置索引 result = result.rename(columns={'Id': 'count'}).reset_index()
最终结果和你预期的完全一致:
tags count 0 family 2 1 friends 2 2 holiday 1
支持更多groupby操作
这样得到的groupby对象是Pandas的标准结构,完全能支持你说的agg、mean等操作。比如假设你的数据集还有year数值列:
# 给原数据新增year列 df['year'] = [2020, 2021, 2022, 2023] # 拆分后按标签分组求year的均值 year_mean = df.explode('tags').dropna(subset=['tags']).groupby('tags')['year'].mean()
运行后得到:
tags family 2016.5 friends 2020.5 holiday 2023.0 Name: year, dtype: float64
关于你之前的尝试
你手动用字典构建分组的思路是对的,但这种方式需要自己维护每个标签对应的DataFrame子集,没办法直接复用Pandas groupby的所有内置方法。而explode+groupby的方式既简洁又能直接享受groupby的所有功能,显然是更优解~
备注:内容来源于stack exchange,提问作者Sanjay Manohar
相关产品推荐
相关产品推荐

