Pandas DataFrame如何统计列单元格内逗号分隔值的出现次数
pandas逐行统计逗号分隔值频次并格式化输出方案
问题背景
现有如下数据集,需要实现Output列的计算逻辑:统计col2列每个单元格内逗号分隔的各取值出现次数,按「值(计数)」的格式拼接得到结果,示例数据如下:
| col1 | col2 | Output |
|---|---|---|
| 2A | TCH_DRop,TCH_DRop,HSR | TCH_DRop(2),HSR(1) |
| 2B | HSR | HSR(1) |
| 2c | SD_DRop,HSR | SD_DRop(1),HSR(1) |
| 1A | HSR,SD_Cong,HSR,SD_Cong | HSR(2),SD_Cong(2) |
执行代码NOK['col2'].str.split(',').value_counts()时触发报错。
报错原因
str.split(',')返回的Series中每个元素是Python列表类型:
- 列表属于不可哈希类型,无法被
value_counts()做去重统计 value_counts()的作用是统计整个Series中整行元素的出现次数,本身也不支持统计每行列表内部的元素频次,和需求逻辑不匹配。
实现代码
无需额外循环,借助collections的Counter做行内计数即可,代码如下:
from collections import Counter # 逐行处理生成Output列 NOK['Output'] = NOK['col2'].apply( lambda cell_text: ','.join([f'{val}({count})' for val, count in Counter(cell_text.split(',')).items()]) )
逻辑说明
- 逐行遍历col2的单元格内容,用
split(',')把逗号分隔的字符串拆分为取值列表 - 调用
Counter直接统计当前行列表内各取值的出现次数,计数效率高于手写字典遍历 - 把计数结果按
值(计数)的格式做字符串格式化,最后用逗号拼接为完整字符串赋值给Output列
执行后得到的结果和示例预期完全一致。
内容的提问来源于stack exchange,提问作者riya
相关产品推荐
相关产品推荐

