pandas如何统计含多个值的单元格内各值出现次数?
多值单元格姓名计数方案解答
- 你不需要必须拆分多值单元格才能完成统计,拆分单元格和不拆分单元格两种路径都可以实现需求。
- 完全可以结合
str.split与value_counts方法实现统计,这也是这类场景下可读性、可维护性最高的常规实现方案。
方案1:str.split+value_counts(拆分单元格实现)
核心逻辑是先按分隔符拆分字符串为列表,展开列表为独立行后清洗脏数据,最后直接计数即可,注意要处理原始数据里末尾多余逗号、前后空格的问题。
import pandas as pd # 构造与描述一致的测试DataFrame df = pd.DataFrame({ "employees on trip": [ "jeff, jerome, betsy,", "jerome,", "betsy, jerome", "jeff," ] }) # 计数逻辑 count_result = ( df["employees on trip"] .str.split(",") # 按逗号分隔拆分字符串为姓名列表 .explode() # 将每个列表里的姓名展开为单独的行 .str.strip() # 去除姓名前后残留的空格 .loc[lambda x: x != ""] # 过滤末尾逗号拆分出的空字符串 .value_counts() # 直接按值计数 )
运行后输出结果完全符合预期:
jerome 3 jeff 2 betsy 2 Name: employees on trip, dtype: int64
方案2:无需拆分单元格的实现方案
如果不想做拆分、展开操作,可以直接用字符串正则匹配的方式逐姓名统计总出现次数,建议加上单词边界匹配规则,避免把包含目标姓名的长名字(比如jeffrey)误统计为jeff。
# 待统计的姓名清单,也可以提前通过正则从列中自动提取 target_names = ["jeff", "jerome", "betsy"] count_result = pd.Series({ name: df["employees on trip"].str.count(fr"\b{name}\b").sum() for name in target_names })
运行后输出结果和方案1完全一致:
jeff 2 jerome 3 betsy 2 dtype: int64
如果你的数据里不存在姓名子串冲突的情况,也可以去掉正则里的\b边界符,直接匹配姓名字符串即可。
内容的提问来源于stack exchange,提问作者Zachary A. Wickard
相关产品推荐
相关产品推荐

