在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
相关产品推荐
相关产品推荐

