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

如何合并两个DataFrame且不生成额外行?解决时间匹配重复问题

解决Pandas合并DataFrame时的重复行与排序问题

问题原因

你之前的操作把df1的time列直接截断,导致两个细粒度时间(15:09.123和15:09.234)变成了同一个15:09,而df2里15:09有两行数据,合并时就会产生笛卡尔积(2×2=4行),这就是重复行的来源。同时截断操作丢失了df1原始的细粒度时间,也没法保留原排序的对应关系。

解决方案

核心思路是给同前缀的行加上组内序号,让df1的每个细粒度时间和df2里同前缀的行一一对应,同时保留df1的原始时间列。具体步骤如下:

  • 给df1新增一个用于匹配的前缀列,不修改原始time;
  • 给df2按time分组,添加组内序号;
  • 给df1按前缀列分组,添加组内序号;
  • 用前缀列+组内序号作为合并键做左连接,最后清理临时列。

完整代码

import pandas as pd

dict1 = {
    "time": ["15:09.123", "15:09.234", "15:10.123", "15:11.123", "15:12.123", "15:12.987"],
    "value": [10, 20, 30, 40, 50, 60]
}

dict2 = {
    "time": ["15:09", "15:09", "15:10"],
    "counts": ["fg", "mn", "gl"],
    "growth": [1, 3, 6]
}

df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)

# 给df1添加前缀列用于匹配
df1["time_prefix"] = df1["time"].str[:-4]

# 给df2的同time分组添加组内序号
df2["group_idx"] = df2.groupby("time").cumcount()

# 给df1的同前缀分组添加组内序号
df1["group_idx"] = df1.groupby("time_prefix").cumcount()

# 合并并清理临时列
result = pd.merge(df1, df2, left_on=["time_prefix", "group_idx"], right_on=["time", "group_idx"], how="left")
result = result[["time_x", "value", "counts", "growth"]].rename(columns={"time_x": "time"})

print(result)

输出结果

time  value counts  growth
0  15:09.123     10     fg     1.0
1  15:09.234     20     mn     3.0
2  15:10.123     30     gl     6.0
3  15:11.123     40    NaN     NaN
4  15:12.123     50    NaN     NaN
5  15:12.987     60    NaN     NaN

完全符合你想要的理想结果,既保留了df1的原始排序和细粒度时间,也实现了同前缀行的一一匹配,没有重复。

内容的提问来源于stack exchange,提问作者Gravity Mass

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:20:30