Pandas如何统计每行中大于另一DataFrame对应阈值的元素数量
Pandas 实现方案
如果已经有实际业务数据可以跳过测试数据构造步骤:
import pandas as pd # 构造测试用df1 df1 = pd.DataFrame({ "Col1": ["ID1", "ID2", "ID3"], "Col2": [2, 7, 9], "Col3": [3, 6, 16], "Col4": [5, 11, 20], "Col5": [0, 5, 12] }) # 构造测试用df2 df2 = pd.DataFrame({ "Col1": ["ID1", "ID2", "ID3"], "ColB": [2, 7, 9] })
方法1:矢量化运算(推荐,大数据量下效率更高)
无需逐行遍历,直接用Pandas内置向量化操作完成计算:
# 生成Col1对应阈值的映射关系 threshold = df1["Col1"].map(df2.set_index("Col1")["ColB"]) # 选取所有数值列(这里用iloc取Col1之后的所有列,也可手动指定列名列表),统计每行大于阈值的元素个数 df1["COUNT"] = df1.iloc[:, 1:].gt(threshold, axis=0).sum(axis=1)
代码说明:
df2.set_index("Col1")["ColB"]将df2转为Col1为索引、ColB为值的序列,方便快速匹配每行对应的阈值gt()是Pandas的大于比较方法,axis=0表示每行的所有元素都和该行对应的阈值做比较sum(axis=1)按行对比较结果(True/False等价于1/0)求和,直接得到符合条件的元素数量
方法2:合并表后计算
适合需要保留阈值列排查问题的场景:
# 关联两个表获取每行对应的阈值 df_temp = df1.merge(df2, on="Col1", how="left") # 统计符合条件的元素个数 df_temp["COUNT"] = df_temp[["Col2", "Col3", "Col4", "Col5"]].gt(df_temp["ColB"], axis=0).sum(axis=1) # 剔除多余的ColB列得到最终结果 df1 = df_temp.drop("ColB", axis=1)
两种方法得到的最终df1都和需求的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Avah
相关产品推荐
相关产品推荐

