如何按Pandas DataFrame中items列的首个元素分组求和?
Pandas按列表首元素分组求和的正确实现
原始数据
import pandas as pd df = pd.DataFrame({'items':[[101,102],[102,101],[102,103], [101,103],[101,101],[102,102], [103,103]], 'value':[12,13,11,15,17,8,19]}) print(df)
需求说明
按df['items']每行列表的首个元素分组,对value列求和:
- 首元素为101的行:value总和为12+15+17=44
- 首元素为102的行:value总和为13+11+8=32
- 首元素为103的行:value总和为19
错误代码分析
你写的df1 = df.groupby(df['items'][1]).agg({'value':sum})逻辑错误:df['items'][1]仅取了items列第二行的单个列表,并非提取每行列表的首元素作为分组依据,导致分组完全不符合需求。
正确解决方案
方案1:用lambda表达式直接提取首元素分组
在groupby中通过lambda函数直接获取每行列表的第一个元素:
df1 = df.groupby(lambda x: df['items'][x][0])['value'].sum().reset_index(name='total_value') df1.rename(columns={'index': 'first_item'}, inplace=True) print(df1)
方案2:新增首元素列后分组(可读性更强)
先给DataFrame新增一列存储每行列表的首元素,再按该列分组求和:
# 新增首元素列 df['first_item'] = df['items'].apply(lambda x: x[0]) # 分组求和 df1 = df.groupby('first_item')['value'].sum().reset_index(name='total_value') print(df1)
方案3:利用Pandas列表列的str索引(高版本支持)
如果你的Pandas版本较新,可以直接用str[0]提取列表首元素:
df1 = df.groupby(df['items'].str[0])['value'].sum().reset_index(name='total_value') df1.rename(columns={'items': 'first_item'}, inplace=True) print(df1)
最终输出结果
三种方案都会得到如下结果:
first_item total_value 0 101 44 1 102 32 2 103 19
内容的提问来源于stack exchange,提问作者DaCard
相关产品推荐
相关产品推荐

