You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含标签式列表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:53:04