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

如何按非唯一日期合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:01:55