按日期分组修正值:DataFrame按时间日期分组后指定条件新增列需求
嘿,这个需求我熟!我来给你一步步拆解怎么实现~
解决方案
首先先明确核心逻辑:我们需要先把「B列等于15:00:00」的行里的C名称和对应的D值提取出来做成映射表,再把这个映射表应用到整个DataFrame,就能新增出你要的匹配列了。
先给你模拟一个类似的DataFrame示例方便理解:
import pandas as pd # 模拟你的按日期时间分组的DataFrame data = { '日期': ['2024-05-01', '2024-05-01', '2024-05-02', '2024-05-02'], 'B': ['14:00:00', '15:00:00', '14:00:00', '15:00:00'], 'C': ['名称A', '名称A', '名称B', '名称B'], 'D': [10, 20, 30, 40] } df = pd.DataFrame(data)
基础版:按C名称匹配
如果你的需求是同一个C名称不管日期,都匹配它所有15:00:00行的D值(假设同名称的D值在15:00时是一致的),可以这么写:
# 第一步:筛选出B列是15:00:00的行,生成C→D的映射字典 name_to_d = df[df['B'] == '15:00:00'].set_index('C')['D'].to_dict() # 第二步:新增列,用map把映射匹配到每一行 df['匹配D值'] = df['C'].map(name_to_d)
运行后你会看到,所有名称A的行都会匹配到15:00对应的D值20,名称B的行匹配到40,完美符合需求~
进阶版:按日期+C名称组合匹配
如果你的DataFrame是按日期分组,同一个C名称在不同日期的15:00有不同D值,那就要把日期也加入映射的键,避免串值:
# 生成「日期+C名称」→D值的映射字典 date_name_to_d = df[df['B'] == '15:00:00'].set_index(['日期', 'C'])['D'].to_dict() # 用组合键来匹配新增列 df['匹配D值'] = df.apply(lambda row: date_name_to_d.get((row['日期'], row['C'])), axis=1)
这样就能保证2024-05-01的名称A匹配当天15:00的D值,不会和其他日期的混淆。
处理缺失值
如果有些C名称(或日期+名称组合)没有对应的15:00行,map或get会返回NaN,你可以用fillna自定义缺失值显示:
df['匹配D值'] = df['C'].map(name_to_d).fillna('无对应15:00数据')
这样整个逻辑就完整啦,你可以根据自己的实际DataFrame结构调整代码~
内容的提问来源于stack exchange,提问作者Tie_24
相关产品推荐
相关产品推荐

