Python如何删除两个DataFrame中按dt列不匹配的行
问题原因
你遇到的报错不是列名不匹配导致的,根本原因有两个:
- 你直接对两个索引、行数大概率都不一致的
Series(discussion['dt']和price['dt'])做逐行等值判断,pandas要求逐行比较的两个Series必须索引完全一致,不符合要求就会抛出你看到的ValueError。 - 两个DataFrame的
dt列格式本身也不一致:第一个price的dt是无时区、精确到天的日期格式,第二个discussion的dt是带时区、精确到秒的时间格式,直接匹配也不会得到正确结果。
解决步骤
步骤1:统一dt列的格式和粒度
首先根据你的匹配需求统一时间粒度,示例分为两种场景:
场景1:按天匹配
import pandas as pd # 将两个dt都转成datetime格式后取日期粒度,消除时区和时分秒的差异 price['dt'] = pd.to_datetime(price['dt']).dt.date discussion['dt'] = pd.to_datetime(discussion['dt']).dt.date
场景2:按精确到秒的时间匹配
import pandas as pd # 统一转成无时区的datetime格式 price['dt'] = pd.to_datetime(price['dt']) discussion['dt'] = pd.to_datetime(discussion['dt']).dt.tz_localize(None)
步骤2:执行匹配过滤
方案A:保留两个表的所有匹配列
用pandas内连接直接得到两边都匹配的合并结果:
merged_df = pd.merge(discussion, price, on='dt', how='inner')
方案B:单独过滤单个表的匹配行
如果只需要保留某一个表中能匹配上的行,用isin方法实现:
# 过滤得到能和price表匹配的discussion行 filtered_discussion = discussion[discussion['dt'].isin(price['dt'].unique())] # 过滤得到能和discussion表匹配的price行 filtered_price = price[price['dt'].isin(discussion['dt'].unique())]
内容的提问来源于stack exchange,提问作者YanRemes
相关产品推荐
相关产品推荐

