You need to enable JavaScript to run this app. 如何通过pandas统计CSV1列值在另一CSV中的出现次数
优惠活动
大模型
产品
解决方案
定价
更多

如何通过pandas统计CSV1列值在另一CSV中的出现次数

按需求实现DataFrame类别统计的方案

核心需求梳理

  • 统计范围:完全以CSV1的Category列去重后的取值为统计基准,不额外统计CSV2中存在但不在CSV1取值范围内的值(如示例中的ISS异常值)
  • 输出规则:最终结果需包含Category、Count两列,依次存储来自CSV1的类别值、对应类别在CSV2同名列的出现次数,匹配示例预期的统计值(HTTP=2、DISK=3、APACHE=1、IIS=3、SQL=1)

原代码的问题定位

你之前尝试的两行逻辑存在两个核心偏差:

  1. 映射逻辑误用:df2['Category'].map(df1.set_index('Category')) 的输入是df1以Category为索引的整个DataFrame,map操作会把匹配到的df1整行值作为映射结果赋值给cat列,而非匹配的类别名本身,后续基于cat列做value_counts完全无法对齐原始类别维度
  2. 结果维度缺失: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 22:15:07