使用pd.concat合并DataFrame遇多余列,merge报错求解决方案
解决DataFrame筛选匹配行的问题
问题根源
pd.concat(axis=1)是按列拼接数据,不是按行匹配筛选,所以会直接把df2的列追加到df1,完全不符合需求。merge报错是因为两个DataFrame的date1/date2列数据类型不统一(一个是datetime64[ns],一个是object),同时df1中存在带空格的日期值(比如A10行的date2是'2014-03-14 '),导致匹配失败。
正确处理步骤
第一步:清理数据,统一匹配列的类型和格式
先处理空格、转换日期类型,确保匹配列的格式完全一致:
import pandas as pd # 处理df1中date2的多余空格 df1['date2'] = df1['date2'].str.strip() # 将date1、date2转换为datetime类型,None会被转为NaT(datetime的空值) df1[['date1', 'date2']] = df1[['date1', 'date2']].apply(pd.to_datetime, errors='coerce') df2[['date1', 'date2']] = df2[['date1', 'date2']].apply(pd.to_datetime, errors='coerce')
第二步:筛选匹配行(两种方法任选)
方法一:用merge实现内连接(推荐)
通过merge的内连接,直接从df1中提取和df2匹配的行:
# 按共同列Baum2、Baum7、date1、date2做内连接 df3 = pd.merge(df1, df2, on=['Baum2', 'Baum7', 'date1', 'date2'], how='inner')
方法二:用元组匹配筛选
把df2的匹配列转成元组集合,然后判断df1的对应行是否在集合中:
# 提取df2的匹配组合为元组列表 match_combinations = list(df2[['Baum2', 'Baum7', 'date1', 'date2']].itertuples(index=False, name=None)) # 筛选df1中匹配的行 df3 = df1[df1[['Baum2', 'Baum7', 'date1', 'date2']].apply(tuple, axis=1).isin(match_combinations)]
两种方法最终都会得到你需要的df3结果。
内容的提问来源于stack exchange,提问作者pyflo
相关产品推荐
相关产品推荐

