如何通过pandas统计CSV1列值在另一CSV中的出现次数
按需求实现DataFrame类别统计的方案
核心需求梳理
- 统计范围:完全以CSV1的Category列去重后的取值为统计基准,不额外统计CSV2中存在但不在CSV1取值范围内的值(如示例中的
ISS异常值) - 输出规则:最终结果需包含Category、Count两列,依次存储来自CSV1的类别值、对应类别在CSV2同名列的出现次数,匹配示例预期的统计值(HTTP=2、DISK=3、APACHE=1、IIS=3、SQL=1)
原代码的问题定位
你之前尝试的两行逻辑存在两个核心偏差:
- 映射逻辑误用:
df2['Category'].map(df1.set_index('Category'))的输入是df1以Category为索引的整个DataFrame,map操作会把匹配到的df1整行值作为映射结果赋值给cat列,而非匹配的类别名本身,后续基于cat列做value_counts完全无法对齐原始类别维度 - 结果维度缺失:
value_counts()只会统计实际出现过的取值,不会自动对齐CSV1里的所有Category值,若某类别在CSV2中出现次数为0,会直接从结果中丢失,无法覆盖全量统计范围,且最终生成的列名也不符合预期的Count命名规则。
可落地的实现方案
两种常用实现方式,都可以完全匹配预期输出:
方案1:左连接对齐统计
import pandas as pd # 读取两个CSV文件 df1 = pd.read_csv("CSV1文件路径.csv") df2 = pd.read_csv("CSV2文件路径.csv") # 1. 统计CSV2中所有Category的出现次数 df2_stat = df2['Category'].value_counts().reset_index() df2_stat.columns = ['Category', 'Count'] # 统一列名做关联 # 2. 以CSV1的去重Category为基准,左连接统计结果,对未匹配到的类别补0计数 result = df1[['Category']].drop_duplicates().merge( df2_stat, on='Category', how='left' ).fillna({'Count': 0}) # 将Count字段从浮点型转为整型,符合计数的类型规范 result['Count'] = result['Count'].astype(int)
该方案会自动过滤掉CSV2中不在CSV1取值范围内的异常值,同时保证所有CSV1中的类别都会出现在最终结果里,哪怕出现次数为0。
方案2:过滤+重索引对齐
import pandas as pd df1 = pd.read_csv("CSV1文件路径.csv") df2 = pd.read_csv("CSV2文件路径.csv") # 提取CSV1中所有需要统计的目标类别 target_cats = df1['Category'].drop_duplicates().tolist() # 过滤CSV2,只保留目标类别的行,统计次数后重索引对齐所有目标类别 result = df2[df2['Category'].isin(target_cats)]['Category'].value_counts()\ .reindex(target_cats) \ .reset_index(name='Count') result.columns = ['Category', 'Count']
该方案执行效率更高,适合数据量较大的场景,核心逻辑是先把CSV2中非目标类别的行全部过滤掉,再通过reindex保证所有目标类别都被纳入结果。
内容的提问来源于stack exchange,提问作者goe
相关产品推荐
相关产品推荐

