如何按非唯一日期合并Pandas DataFrame且不重复填充关联值
解决方案
当然可以实现,这里提供两种不需要直接使用duplicated()方法的方案:
方法一:通过组内行号匹配合并
先给两个DataFrame添加组内匹配标识,只让df1中每个日期的第一行与df2关联:
import pandas as pd import numpy as np df1 = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1', '2012-1-1']), 'a':[8,9]}, columns=['date', 'a']) df2 = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1']), 'b':[2]}, columns=['date', 'b']) # 给df1生成每个date分组内的行号(从0开始) df1['row_idx'] = df1.groupby('date').cumcount() # 给df2添加固定行号0,只匹配df1的第一行 df2['row_idx'] = 0 # 基于date和row_idx做左连接,之后删除辅助列 result = pd.merge(df1, df2, on=['date', 'row_idx'], how='left').drop('row_idx', axis=1) print(result)
输出结果与预期一致:
date a b 0 2012-01-01 8 2.0 1 2012-01-01 9 NaN
方法二:合并后通过分组处理列值
先执行常规左连接,再对b列按日期分组,仅保留每组第一个值,其余设为NaN:
import pandas as pd import numpy as np df1 = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1', '2012-1-1']), 'a':[8,9]}, columns=['date', 'a']) df2 = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1']), 'b':[2]}, columns=['date', 'b']) # 常规左连接 merged = pd.merge(df1, df2, on='date', how='left') # 按date分组,将b列除第一行外的所有值替换为NaN merged['b'] = merged.groupby('date')['b'].transform(lambda x: x.where(x.index == x.index[0], np.nan)) print(merged)
同样能得到符合预期的结果。
内容的提问来源于stack exchange,提问作者J CB
相关产品推荐
相关产品推荐

