在Pandas中统计DataFrame列值大于等于另一DataFrame列值的次数
为Pandas DataFrame添加基于另一DataFrame的累积计数列
看起来你需要给df添加一列count_greaterandequal,根据你给出的预期输出推断,实际需求应该是:每行的值对应df_2['r_no']中小于等于当前行r_no的元素总数量(按原描述的“大于等于”计算结果和预期不符,这里先按预期结果实现)。下面是具体的解决方案:
第一步:还原原始数据
先构造题目中给出的两个DataFrame:
import pandas as pd df = pd.DataFrame() df['r_no'] = [1,1,1,2,3,1,1,1,2] df['user'] = ['sam','sam','sam','sam','peter','jack','jack','Kris','peter'] df['value'] = [76,76,7,8,8,2,29,2,8] df['cam_id'] = ['ab','abc','ab','ab','ab','abcd','abcd','abcd','ab'] df_2 = pd.DataFrame() df_2['r_no'] = [1,3,2,2,4,1,1,3,2,5,7,2,8,9,3]
第二步:核心实现代码
我们用统计频率+累积求和的方式高效计算,避免逐行遍历的低效问题:
# 1. 统计df_2中每个r_no的出现次数,并按r_no从小到大排序 r_no_counts = df_2['r_no'].value_counts().sort_index() # 2. 计算累积求和,得到每个r_no对应的<=它的总元素数量 cumulative_counts = r_no_counts.cumsum() # 3. 将结果映射到df的新列,用fillna处理可能的缺失值(比如df有df_2没有的r_no) df['count_greaterandequal'] = df['r_no'].map(cumulative_counts).fillna(0).astype(int) # 查看最终结果 print(df['count_greaterandequal'])
输出结果
运行代码后会得到和你预期完全一致的结果:
0 3 1 3 2 3 3 7 4 10 5 3 6 3 7 3 8 7 Name: count_greaterandequal, dtype: int64
代码逻辑解释
value_counts().sort_index():先统计df_2中每个r_no的出现次数,再按r_no从小到大排序,得到的结果如下:1 3 2 4 3 3 4 1 5 1 7 1 8 1 9 1 Name: r_no, dtype: int64cumsum():对排序后的计数做累积求和,这样每个r_no对应的结果就是所有小于等于它的元素总数量:1 3 2 7 3 10 4 11 5 12 7 13 8 14 9 15 Name: r_no, dtype: int64map():快速将df中的每个r_no映射到对应的累积计数,比逐行循环计算效率高得多。
补充:如果需求确实是“大于等于当前r_no”
如果你原本的需求真的是统计df_2中大于等于当前行r_no的元素数量,只需要调整排序方向即可:
# 按r_no从大到小排序后累积求和 r_no_counts_desc = df_2['r_no'].value_counts().sort_index(ascending=False) cumulative_counts_desc = r_no_counts_desc.cumsum() df['count_greaterandequal'] = df['r_no'].map(cumulative_counts_desc).fillna(0).astype(int)
不过这个结果和你给出的预期不符,所以推测你实际需要的是前面的实现。
内容的提问来源于stack exchange,提问作者andjkd
相关产品推荐
相关产品推荐

