在R中按特定条件将两个DataFrame的值匹配填充至目标DataFrame
基于月份与mbs匹配填充DataFrame的解决方案
1. 统一月份匹配键
首先需要将所有DataFrame的month列处理为忽略日的年月标识,避免日期天的差异导致匹配失效。假设month列是datetime类型,若不是需先转换:
import pandas as pd # 转换month列为datetime(若原始类型不是) for df in [DF1, DF2, DF3]: df['month'] = pd.to_datetime(df['month']) # 提取年月作为匹配键 for df in [DF1, DF2, DF3]: df['month_key'] = df['month'].dt.to_period('M')
2. 匹配DF1数据并填充至DF3
假设DF1需要填充到DF3的列是col_a、col_b(替换为你的实际列名),通过左连接匹配month_key和mbs,不匹配项填充0:
# 提取DF1的匹配键与目标列 df1_merge = DF1[['month_key', 'mbs', 'col_a', 'col_b']] # 左连接到DF3 DF3 = DF3.merge(df1_merge, on=['month_key', 'mbs'], how='left') # 空值替换为0 DF3[['col_a', 'col_b']] = DF3[['col_a', 'col_b']].fillna(0)
3. 匹配DF2数据并填充至DF3
同理处理DF2,假设需填充的列是col_c、col_d:
# 提取DF2的匹配键与目标列 df2_merge = DF2[['month_key', 'mbs', 'col_c', 'col_d']] # 左连接到DF3 DF3 = DF3.merge(df2_merge, on=['month_key', 'mbs'], how='left') # 空值替换为0 DF3[['col_c', 'col_d']] = DF3[['col_c', 'col_d']].fillna(0)
4. 清理临时列(可选)
若不需要保留month_key临时列,可删除:
DF3.drop('month_key', axis=1, inplace=True)
关键注意点
- 确保三个DataFrame的
mbs列数据类型一致(如均为字符串或数值),否则会出现匹配失败 - 若DF1/DF2存在重复的
month_key+mbs组合,需先去重或聚合(如取均值、保留最新行):# 示例:DF1按匹配键去重,保留最后一行 df1_merge = df1_merge.drop_duplicates(subset=['month_key', 'mbs'], keep='last')
内容的提问来源于stack exchange,提问作者Rafael Nakamura
相关产品推荐
相关产品推荐

