Hello Stack Overflow社区, 我有一个问题,熊猫不理解我的合并条件。它与其他“键”一起使用,但只要我将“日期”列作为键包含就会中断。 “Date”列是两个数据帧中的字符串对象(不是时间戳)。
换句话说,我希望所有4个'键'在从df2到df的“左合并”之前是相同的,而不会丢失df中的任何数据。此外,当我在Excel中打开csv文件时,日期格式看起来完全相同(例如:2015年5月10日)。
但是,Pandas将“csv_file1”,[df]中的日期列读作“5-6-2015”:
In [1]: df['Date']
Out[1]:
Date
0 2015-5-11
1 2015-5-11
2 2015-5-10
3 2015-5-12
Pandas将“csv_file2”,[df2]中的日期列读作“5/6/2015”:
In [2]: df2['Date']
Out[2]:
Date
0 5/11/2015
1 5/11/2015
2 5/12/2015
3 5/13/2015
4 5/17/2015
两者的dtypes都是“obj”;我不明白为什么Pandas会以不同的方式阅读'Date'列的格式。
以下是左合并前数据框的样子:
In [3]: df
Out[3]:
Date Hour Make Model Gas Rating Safety Rating
0 2015-5-11 1 Honda Accord 9 8
1 2015-5-11 0 Toyota Camry 9 10
2 2015-5-10 23 Chevy Sonic 7 6
3 2015-5-12 13 Honda Civic 8 7
In [4]: df2
Out[4]:
Date Hour Make Model Mileage Rating Speed Rating
0 5/11/2015 1 Honda Accord 10 7
1 5/11/2015 0 Toyota Camry 10 7
2 5/12/2015 23 Honda Civic 9 6
3 5/13/2015 23 Honda Civic 9 6
4 5/17/2015 7 Chevy Impala
当我尝试左合并时会发生这种情况:
In [5]: final = pd.merge(left=df, right=df2, how='left', on=['Date', 'Hour', 'Make', 'Model'])
In [6]: final
Out[6]:
Date Hour Make Model Gas Rating Safety Rating Mileage Rating \
0 2015-5-11 1 Honda Accord 9 8 NaN
1 2015-5-11 0 Toyota Camry 9 10 NaN
2 2015-5-10 23 Chevy Sonic 7 6 NaN
3 2015-5-12 13 Honda Civic 8 7 NaN
Speed Rating
0 NaN
1 NaN
2 NaN
3 NaN
如果我在没有'Date'键的情况下尝试合并,数据传输大部分都是正确的,但这是由于两者中的重复数据而导致的数据过多而且不准确因为我只需要所有四个键的数据('日期','小时','制作','模型')匹配和左边合并数据之前的任何内容。
总会有更多重复的Make / Model& df2中的小时所以我只想将合并匹配留给df,无论df中有多少重复实例。我也不希望丢失df中的任何数据,因此df中找不到df的任何日期都应该保留。
如果'Date'合并条件有效,这就是我想要实现的输出:
In [7]: final
Out[7]:
Date Hour Make Model Gas Rating Safety Rating Mileage Rating \
0 5/11/2015 1 Honda Accord 9 8 10
1 5/11/2015 0 Toyota Camry 9 10 10
2 5/10/2015 23 Chevy Sonic 7 6 NaN
3 5/12/2015 13 Honda Civic 8 7 8
Speed Rating
0 7
1 7
2 NaN
3 7
有谁知道为什么会这样?我甚至尝试将'Date'列拼接成3列('Month','Day','Year')并将dtype更改为int64,bool,obj,也没有成功。所以我认为它与格式有关。
提前感谢Stack Overflow社区!
答案 0 :(得分:1)
在合并之前运行以下代码应该将日期放入一个通用格式,以便合并正常。
import time
df['Date']=time.strftime('%Y-%m-%d',time.strptime(df['date'],'%m/%d/%Y'))
df2['Date']=time.strftime('%Y-%m-%d',time.strptime(df2['date'],'%Y-%m-%d'))
简单地更改其中一个日期本来不错,但是python时间库会在%m
和%d
标记的月份和日期中添加前导0。 %-m
和%-d
代码不会添加前导0,但它们不适用于所有系统。有关这种奇怪的更多信息,请参阅here。