如何在Pandas列中统计含多值单元格的元素出现次数
问题说明
我有一个Pandas DataFrame,其中包含名为specialty的列,数据如下:
0 1,5 1 1 2 1 3 1 4 1 5 1,5 6 3 7 3 8 1 9 1,3 10 1 11 1,2,4,6
需要实现的统计逻辑:
- 单元格包含多个值(逗号分隔)时,既要将该行计入数字7的统计(代表多值行数量),也要将单元格内每个数字分别累加到对应数字的总次数中
- 最终需输出各数字的出现次数及占比
期望输出(次数部分):
1: 10 2: 1 3: 3 4: 1 5: 2 6: 1 7: 4
当前代码仅将多值单元格转为7统计,未实现各数字累加:
# Convert specialties with more than 1 to item 7 (multiple) part_chars['specialty'] = np.where(part_chars['specialty'].str.len() > 1, 7, part_chars['specialty']) counts = part_chars.specialty.value_counts() percs = part_chars.specialty.value_counts(normalize=True)*100 pd.concat([counts,percs], axis=1, keys=['count', 'percentage'])
该代码输出:
count percentage 7 213 40.804598 1 211 40.421456 3 39 7.471264 5 23 4.406130 6 13 2.490421 4 12 2.298851 2 11 2.107280
解决方案
可以分三步实现需求:拆分多值单元格统计数字次数、统计多值行数量、合并结果并计算占比。
步骤1:拆分多值单元格并统计各数字次数
将specialty列按逗号拆分后展开为多行,再统计每个数字的出现次数:
import pandas as pd # 示例数据(替换为你的DataFrame) data = {'specialty': ['1,5', '1', '1', '1', '1', '1,5', '3', '3', '1', '1,3', '1', '1,2,4,6']} part_chars = pd.DataFrame(data) # 拆分多值单元格并展开为单行 split_series = part_chars['specialty'].str.split(',', expand=True).stack().reset_index(drop=True) # 统计各数字出现次数 num_counts = split_series.value_counts().astype(int)
步骤2:统计多值行数量(对应数字7)
判断每行是否包含多个值,统计这类行的总数:
# 统计包含逗号的行(即多值行)的数量 multi_row_count = part_chars['specialty'].str.contains(',').sum() # 转为Series,索引设为'7' multi_counts = pd.Series([multi_row_count], index=['7'], name='count')
步骤3:合并结果并计算占比
将两部分统计结果合并,再计算每个值的占比(占所有统计项总次数的比例):
# 合并统计结果并按索引排序 final_stats = pd.concat([num_counts, multi_counts]).sort_index().to_frame(name='count') # 计算占比并保留两位小数 final_stats['percentage'] = (final_stats['count'] / final_stats['count'].sum()) * 100 final_stats['percentage'] = final_stats['percentage'].round(2) # 输出结果 print(final_stats)
示例数据运行结果
count percentage 1 10 45.45 2 1 4.55 3 3 13.64 4 1 4.55 5 2 9.09 6 1 4.55 7 4 18.18
内容的提问来源于stack exchange,提问作者Hefe
相关产品推荐
相关产品推荐

