Pandas自定义计数函数返回错误值,id_x匹配parentId统计结果不符预期
代码问题定位
你的代码没法得到正确结果,核心是三个层面的逻辑错误:
1. 传参范围错误,完全没用到全表数据
你用apply(axis=1)逐行遍历的时候,传给node_counter的两个参数根本不是全表的列集合,只是当前行的两个单值字符串:
x['id_x']是当前行id_x列的单个值(比如第一行的UUID字符串)x['parentId']是当前行parentId列的单个值(比如第一行的上级ID字符串)
整个过程根本没有遍历全表parentId列的逻辑,从源头就不可能统计到全表的匹配数量。
2. 自定义函数的计数逻辑存在硬bug
就算把参数传成全表的列,node_counter的实现也没法输出正确结果:
- 计数器
counter = 0被写在了for element in id_x的循环内部,每遍历一个元素就会把计数重置为0,根本无法累计匹配次数 - 由于实际传入的
id_x是单个完整字符串,Python对字符串执行for循环会逐字符拆分遍历,相当于把UUID拆成单个字符挨个和单值的parentId做比对,最后输出的4、6这类无效计数,全是逐字符比对带来的错误结果。
需求的正确实现方式
你要计算的Amount,本质是全表parentId列中,与当前行id_x值相等的元素总个数。完全不需要逐行写循环,直接基于全表频次映射计算即可:
# 统计全表parentId每个值的出现频次 parent_freq = df['parentId'].value_counts() # 按id_x匹配对应频次,无匹配的补0 df['Amount'] = df['id_x'].map(parent_freq).fillna(0).astype(int)
运行后即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Elodin
相关产品推荐
相关产品推荐

