You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas一行代码统计每行中name_前缀列与ID列的匹配次数?

解决方案

可以用一行代码实现需求,核心思路是先筛选出name_前缀的列,再逐行和ID_var的值做相等比较,最后按行求和统计匹配数量:

df['total_name'] = df.filter(like='name_').eq(df['ID_var'], axis=0).sum(axis=1)

代码拆解

  • df.filter(like='name_'):筛选出所有列名包含name_的列,也就是目标变量组
  • .eq(df['ID_var'], axis=0):将筛选出的每一列,与对应行的ID_var值做完全相等的比较,返回布尔值DataFrame(相等为True,不等为False)
  • .sum(axis=1):按行对布尔值求和(True等价于1,False等价于0),得到每行的匹配数量

验证示例

把代码代入你的示例数据集:

import pandas as pd

df = pd.DataFrame({
        'ID_var': ['ab?c', 'xyzyy', 'ab?c', 'ghi55'],
        'name_01': ['def55', 'abc',  'ab?c', 'def'],
        'name_02': ['ab?c', 'jkl123', 'ab?c', 'ghi55'],
        'name_03': ['ghi55', 'mn_o', 'ab?c', 'ghi55'],
        'not_name': [0, 1, 2, 3],
        'other_str': ['str1', 'str2', 'str3', 'str'],    
    })

# 一行代码添加统计列
df['total_name'] = df.filter(like='name_').eq(df['ID_var'], axis=0).sum(axis=1)

print(df)

输出结果和你期望的df_final完全一致,total_name列的值为[1,0,3,2]。

补充说明

你提到的pd.str.contains是用来匹配子串的,而这里需要的是完全相等的匹配,所以用eq更合适,避免出现子串匹配导致的错误统计。

内容的提问来源于stack exchange,提问作者JRR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:25:34