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

在df1中新增res列:按ID匹配date B后统计大于dateA的Date C数量

解决方法:为DataFrame添加统计列并按要求排序

咱们一步步来实现你的需求,先理清楚核心逻辑:要给df1新增res列,每个值对应当前行ID在df2中满足两个条件的date C数量,最后整个res列按降序排列。两个条件是:

  • date C大于当前行的date A
  • 该ID在df2中的date C总数,多于它在df1中的date B总数(也就是该ID在df1的行数)

步骤1:转换日期格式(关键!)

首先得把字符串格式的日期转成datetime类型,不然没法做大小比较:

import pandas as pd

# 转换df1的日期列
df1['date A'] = pd.to_datetime(df1['date A'], format='%d/%m/%y')
df1['date B'] = pd.to_datetime(df1['date B'], format='%d/%m/%y')

# 转换df2的日期列(假设df2包含ID和date C列)
df2['date C'] = pd.to_datetime(df2['date C'], format='%d/%m/%y')

步骤2:预计算每个ID的基础计数

先算出每个ID在两个DataFrame里的日期数量,用来筛选符合条件的ID:

# 统计df1中每个ID的date B数量(即该ID的行数)
id_b_count = df1['ID'].value_counts()

# 统计df2中每个ID的date C总数
id_c_count = df2['ID'].value_counts()

# 筛选出df2中date C总数 > df1中date B数量的ID
valid_ids = id_c_count[id_c_count > id_b_count].index

步骤3:计算每行的res值

接下来对df1的每一行,统计符合条件的date C数量:

def calculate_res(row):
    # 如果ID不在有效列表里,直接返回0
    if row['ID'] not in valid_ids:
        return 0
    # 筛选df2中同ID且date C > 当前行date A的记录
    filtered = df2[(df2['ID'] == row['ID']) & (df2['date C'] > row['date A'])]
    return len(filtered)

# 应用函数生成res列
df1['res'] = df1.apply(calculate_res, axis=1)

步骤4:按res列降序排列

最后把df1按res列从大到小排序,满足“降序展示每个ID对应的计数”的要求:

df1 = df1.sort_values(by='res', ascending=False).reset_index(drop=True)

注意事项

  • 如果你的数据集很大,apply方法可能效率偏低,可以改用merge结合分组统计的方式优化,比如先给df2按ID分组预处理,再和df1合并计算;
  • 确保df2里的ID列和df1的ID列是同类型(比如都是整数),避免匹配错误;
  • 如果日期格式有变种(比如部分是yyyy/mm/dd),可以调整pd.to_datetime的format参数,或者用infer_datetime_format=True自动推断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:21:07