如何在Python DataFrame的各列中统计自定义列表值的出现次数?
解决DataFrame自定义值按列统计次数的问题
我来帮你搞定这个统计需求!先看看你之前代码里的几个小问题:
- 循环顺序搞反了:你先遍历关键词再遍历列,这样会重复处理同一列多次,效率低还容易混乱,应该先遍历每一列,再对该列统计所有目标关键词的次数
- 统计方法不对:
_tmp_df[_tmp_df[column] == x].count()会返回整个DataFrame中符合条件的行的所有列计数,不是当前列的单个值计数str.count(x)是统计每个单元格里字符串x出现的次数(比如单元格是'hihi'会算2次),不是单元格等于x的次数[_tmp_df[column] == x].count只是引用了count方法,没有实际调用执行
下面给你两种靠谱的实现方式,都能输出你想要的格式:
方法一:逐列遍历+统计输出
这种方式直观易懂,适合新手理解:
import pandas as pd # 替换成你的实际DataFrame _tmp_df = pd.DataFrame({ 'column_1': ['hi', 'hello', '-', 'hi', '01.01.9999', 'hi'], 'column_2': ['hello', 'hello', '-', '-', '-', 'hi'] }) # 你的自定义目标值列表 target_values = ['hi', 'hello', '-', '01.01.9999'] # 遍历每一列 for col_name in _tmp_df.columns: # 统计当前列的目标值出现次数: # value_counts() 统计现有值的次数,reindex补全所有目标值,fill_value=0填充不存在的值的计数 value_counts = _tmp_df[col_name].value_counts().reindex(target_values, fill_value=0) # 按要求格式输出每一个目标值的计数 for val, cnt in value_counts.items(): print(f"{col_name}, '{val}', {cnt}")
运行这段代码会输出:
column_1, 'hi', 3 column_1, 'hello', 1 column_1, '-', 1 column_1, '01.01.9999', 1 column_2, 'hi', 1 column_2, 'hello', 2 column_2, '-', 3 column_2, '01.01.9999', 0
方法二:批量处理+格式转换
如果你的DataFrame列很多,用apply批量处理效率更高,最后再转成目标格式:
import pandas as pd _tmp_df = pd.DataFrame({ 'column_1': ['hi', 'hello', '-', 'hi', '01.01.9999', 'hi'], 'column_2': ['hello', 'hello', '-', '-', '-', 'hi'] }) target_values = ['hi', 'hello', '-', '01.01.9999'] # 批量统计所有列的目标值次数 count_result = _tmp_df.apply(lambda col: col.value_counts().reindex(target_values, fill_value=0)) # 把宽格式的结果转成你需要的长格式 long_format = count_result.unstack().reset_index() long_format.columns = ['column_name', 'target_value', 'count'] # 遍历输出 for _, row in long_format.iterrows(): print(f"{row['column_name']}, '{row['target_value']}', {row['count']}")
这段代码的输出和方法一完全一致,但处理大量列时速度更快。
核心逻辑说明
reindex(target_values, fill_value=0) 是关键:它会强制把统计结果的索引替换成你的目标列表,对于列中不存在的目标值,自动填充0,这样就能保证每个列都能输出四个目标值的计数,包括出现次数为0的情况。
内容的提问来源于stack exchange,提问作者JohnDole
相关产品推荐
相关产品推荐

