如何合并两个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
相关产品推荐
相关产品推荐

