如何在Pandas中纵向堆叠DataFrame并忽略重复时间戳行?
Pandas多DataFrame堆叠并去重时间戳的实现方法
要实现将多个DataFrame纵向堆叠且仅保留每个时间戳的首次出现行,可以通过pd.concat结合drop_duplicates快速完成,具体步骤如下:
完整代码示例
import pandas as pd # 创建测试用时间序列 last_10 = pd.datetime.now().replace(microsecond=0) - pd.Timedelta('10H') dates = pd.date_range(last_10, periods=10, freq='H') N = 5 df1 = pd.DataFrame({'y': range(1, N + 1),'time': dates[0:N]}) df2 = pd.DataFrame({'y': range(1, N + 1),'time': dates[2:2+N]}) df3 = pd.DataFrame({'y': range(1, N + 1),'time': dates[5:5+N]}) # 核心合并逻辑 merged_df = (pd.concat([df1, df2, df3]) .drop_duplicates(subset='time', keep='first') # 按time列去重,保留首次出现的行 .sort_values('time') # 按时间排序(可选,让结果更直观) .reset_index(drop=True)) # 重置索引 print(merged_df)
关键步骤说明
- 纵向堆叠:
pd.concat([df1, df2, df3])将三个DataFrame合并为一个包含所有行的临时DataFrame,包括重复时间戳的行。 - 去重处理:
drop_duplicates(subset='time', keep='first')指定以time列为判断重复的依据,保留每个时间戳第一次出现的行,后续重复行直接丢弃,完全符合"存在则跳过"的需求。 - 可选优化:
sort_values('time')确保结果按时间顺序排列;reset_index(drop=True)清除原索引,生成连续的新索引。
补充说明
如果需要保留每个时间戳最后出现的行,只需将keep='first'改为keep='last'即可。另外,在Pandas 2.0及以上版本中,推荐使用pd.Timestamp.now()替代pd.datetime.now(),避免版本兼容警告。
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

