如何在Python中对含列表列的DataFrame进行分组统计
问题:统计分组下各Value在不同ID中的出现次数
给定如下DataFrame:
import pandas as pd l1 = [1,2,3,1,2,3] l2 = ['A','A','A','B','B','B'] values = [['Ram', 'Ford', 'Honda', 'Ford'],['Ford', 'Toyota', 'Subaru'],['Ford', 'Ram'],['Volvo', 'Honda', 'Ford'],['Honda', 'Ford', 'Toyota', 'Ford'],['Ram', 'Ford']] d = {'ID': l1, 'Group': l2, 'Values': values} df = pd.DataFrame(d)
DataFrame内容如下:
ID Group Values 1 A [Ram, Ford, Honda, Ford] 2 A [Ford, Toyota, Subaru] 3 A [Ford, Ram] 1 B [Volvo, Honda, Ford] 2 B [Honda, Ford, Toyota, Ford] 3 B [Ram, Ford]
需要得到每个Group下各Value在不同ID中的出现次数,期望结果:
ID Group Value 1 2 3 A Ram 1 0 1 A Ford 2 1 1 A Honda 1 0 0 A Toyota 0 1 0 A Subaru 0 1 0 B Volvo 1 0 0 B Honda 1 1 0 B Ford 1 2 1 B Toyota 0 1 0 B Ram 0 0 1
解决方案
可以通过以下步骤实现:
- 展开嵌套列表:把
Values列中的每个元素拆分成单独行,保留对应的ID和Group信息 - 分组统计次数:按
Group、Value、ID三级分组,统计每组的出现频次 - 重塑宽表结构:将长表转换为宽表,缺失的ID位置填充0,最后调整索引与列层级
完整代码如下:
# 展开嵌套列表,生成每行对应一个Value的DataFrame df_exploded = df.explode('Values').rename(columns={'Values': 'Value'}) # 分组统计每个(Group, Value, ID)组合的出现次数 count_df = df_exploded.groupby(['Group', 'Value', 'ID']).size().reset_index(name='Count') # 转换为宽表,缺失值用0填充 result = count_df.pivot_table( index=['Group', 'Value'], columns='ID', values='Count', fill_value=0 ) # 调整列名层级显示,匹配期望格式 result.columns.name = 'ID' print(result)
运行代码后即可得到目标结果。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

