如何用Pandas合并两个DataFrame并保留唯一ShowingDateTime(优先取第一个)
Pandas合并CSV文件并按规则去重排序的实现方案
没问题,这需求用Pandas的几个核心方法就能轻松搞定,我给你一步步拆解实现思路和代码:
1. 读取CSV文件并解析日期字段
首先咱们需要把两个CSV文件读取成DataFrame,重点要把ShowingDateTime字段解析成日期时间类型,否则后面排序和去重会因为字符串格式出问题。代码如下:
import pandas as pd # 读取第一个CSV,指定解析ShowingDateTime为日期类型 df1 = pd.read_csv('csv1.csv', parse_dates=['ShowingDateTime']) # 读取第二个CSV,同样解析日期字段 df2 = pd.read_csv('csv2.csv', parse_dates=['ShowingDateTime'])
如果你的日期格式比较特殊(比如示例里的1/4/17 12:00是月/日/年),Pandas默认能识别,但如果遇到识别失败的情况,可以额外指定date_format参数,比如:
df1 = pd.read_csv('csv1.csv', parse_dates=['ShowingDateTime'], date_format='%m/%d/%y %H:%M')
2. 合并DataFrame并按规则去重
接下来把两个DataFrame行拼接起来,然后针对ShowingDateTime字段去重,保留第一个DataFrame里的重复行,舍弃第二个的。这里用pd.concat()拼接,再用drop_duplicates()实现去重规则:
# 拼接两个DataFrame,df1在前,df2在后 combined_df = pd.concat([df1, df2], ignore_index=True) # 按ShowingDateTime去重,保留第一次出现的行(也就是df1里的行) deduplicated_df = combined_df.drop_duplicates(subset='ShowingDateTime', keep='first')
这里keep='first'是关键,因为我们把df1放在前面拼接,所以重复的日期会优先保留df1里的记录。
3. 按ShowingDateTime升序排序
最后对去重后的DataFrame按日期字段升序排序:
# 按ShowingDateTime升序排序,重置索引 final_df = deduplicated_df.sort_values(by='ShowingDateTime', ascending=True).reset_index(drop=True)
reset_index(drop=True)是为了去掉排序后混乱的旧索引,生成连续的新索引,方便后续处理。
完整代码整合
把上面的步骤整合起来,就是完整的实现代码:
import pandas as pd # 读取CSV并解析日期 df1 = pd.read_csv('csv1.csv', parse_dates=['ShowingDateTime']) df2 = pd.read_csv('csv2.csv', parse_dates=['ShowingDateTime']) # 拼接+去重+排序 final_df = pd.concat([df1, df2], ignore_index=True)\ .drop_duplicates(subset='ShowingDateTime', keep='first')\ .sort_values(by='ShowingDateTime', ascending=True)\ .reset_index(drop=True) # 可以查看结果或者保存为新CSV print(final_df.head()) # final_df.to_csv('merged_result.csv', index=False)
补充说明
- 如果你的需求是列合并(比如两个CSV有不同的列,需要按日期关联),那就要用
merge方法,但从你的描述来看,应该是行合并后去重,所以concat+drop_duplicates是最优方案。 - 一定要确保
ShowingDateTime是日期时间类型,否则排序可能会出现字符串排序的错误(比如10/1/17会排在2/1/17前面)。
内容的提问来源于stack exchange,提问作者Defcon
相关产品推荐
相关产品推荐

