无法基于date列合并Pandas DataFrames的问题排查与解决
问题描述
我有两个结构如下的DataFrames:
left DataFrame
date B N S yesterday_B yesterday_N yesterday_S 0 2021-01-03 4 99 0 3.0 80.0 0.0 1 2021-01-04 3 78 0 4.0 99.0 0.0 2 2021-01-05 0 50 0 3.0 78.0 0.0 3 2021-01-06 2 50 0 0.0 50.0 0.0 4 2021-01-07 2 10 0 2.0 50.0 0.0
right DataFrame
finish yesterday change day_t-2 date 0 11900 12230 -1 12850.0 2021-01-03 1 12150 11900 1 12230.0 2021-01-04 2 11640 12150 -1 11900.0 2021-01-05 3 11100 11640 -1 12150.0 2021-01-06 4 10620 11100 -1 11640.0 2021-01-09
我尝试用以下代码基于date列做左连接:
df = pd.merge(left, right, on='date', how='left')
但得到异常结果:
index date B N S yesterday_B yesterday_N yesterday_S finish_price yesterday_price price_change price_day_t-2 0 0 2021-01-03 1 2021-01-04 2 2021-01-05 3 2021-01-06 4 2021-01-07 ... 502 2022-06-06 503 2022-06-07 504 2022-06-08 505 2022-06-09 506 2022-06-10 Name: date, Length: 507, dtype: datetime64[ns] 4 99 0 3.0 80.0 0.0 NaN NaN NaN NaN 1 0 2021-01-03 1 2021-01-04 2 2021-01-05 3 2021-01-06 4 2021-01-07 ... 502 2022-06-06 503 2022-06-07 504 2022-06-08 505 2022-06-09 506 2022-06-10 Name: date, Length: 507, dtype: datetime64[ns] 3 78 0 4.0 99.0 0.0 NaN NaN NaN NaN 2 0 2021-01-03 1 2021-01-04 2 2021-01-05 3 2021-01-06 4 2021-01-07 ... 502 2022-06-06 503 2022-06-07 504 2022-06-08 505 2022-06-09 506 2022-06-10 Name: date, Length: 507, dtype: datetime64[ns] 0 50 0 3.0 78.0 0.0 NaN NaN NaN NaN 3 0 2021-01-03 1 2021-01-04 2 2021-01-05 3 2021-01-06 4 2021-01-07 ... 502 2022-06-06 503 2022-06-07 504 2022-06-08 505 2022-06-09 506 2022-06-10 Name: date, Length: 507, dtype: datetime64[ns] 2 50 0 0.0 50.0 0.0 NaN NaN NaN NaN 4 0 2021-01-03 1 2021-01-04 2 2021-01-05 3 2021-01-06 4 2021-01-07 ... 502 2022-06-06 503 2022-06-07 504 2022-06-08 505 2022-06-09 506 2022-06-10 Name: date, Length: 507, dtype: datetime64[ns] 2 10 0 2.0 50.0 0.0 NaN NaN NaN NaN
为什么无法正确识别date列进行合并?我已经将datetime转为字符串,求解决办法?
解决方案
问题原因
从异常结果能看出,你的left或right的date列并不是单个值的Series,而是每个单元格都包含了整个date序列(比如每个单元格都显示从2021-01-03到2022-06-10的所有日期)。这种错误赋值导致pd.merge无法找到匹配的单个日期,最终返回全NaN的结果。
修复步骤
检查并修正date列赋值逻辑
排查数据处理过程中是否出现错误赋值,比如不小心将整个date列覆盖了单个单元格的值。确保每个单元格仅对应一行的日期值。统一date列格式
先将date列转为标准的日期格式,再转为字符串(如果需要):# 若date列是datetime类型,转为统一格式的字符串 left['date'] = left['date'].dt.strftime('%Y-%m-%d') right['date'] = right['date'].dt.strftime('%Y-%m-%d') # 若从文件读取数据,直接指定解析格式 left = pd.read_csv('left.csv', parse_dates=['date'], date_format='%Y-%m-%d') right = pd.read_csv('right.csv', parse_dates=['date'], date_format='%Y-%m-%d') left['date'] = left['date'].astype(str) right['date'] = right['date'].astype(str)验证date列的正确性
合并前确认date列每个值都是单个日期:print(left['date'].head()) print(right['date'].head())输出应类似:
0 2021-01-03 1 2021-01-04 2 2021-01-05 3 2021-01-06 4 2021-01-07 Name: date, dtype: object重新执行合并
确认date列正常后,运行合并代码:df = pd.merge(left, right, on='date', how='left')此时2021-01-03至2021-01-06的行会匹配到right中的对应数据,2021-01-07的行因无匹配日期会显示NaN,这是左连接的正常结果。
内容的提问来源于stack exchange,提问作者Mohmmad Hadi
相关产品推荐
相关产品推荐

