如何用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
相关产品推荐
相关产品推荐

