pd.concat() 和 pd.merge() 之间的区别以及为什么我得到错误的输出?
Difference between pd.concat() and pd.merge() and why do I get wrong output?
我在需要加入两个数据帧时遇到了困难。我通常应用pd.merge()。但在这种情况下,我得到一个 ValueError,我被推荐使用 pd.concat()。所以,我的情况是这样的:
我有两个数据帧,df1 和 df2,下面是它们的索引。
In [15]: df1.index
Out[15]:
DatetimeIndex(['2019-11-03 00:00:00', '2019-11-03 01:00:00',
'2019-11-03 02:00:00', '2019-11-03 03:00:00',
...
'2019-11-12 11:00:00', '2019-11-12 12:00:00',
'2019-11-12 13:00:00', '2019-11-12 14:00:00'],
dtype='datetime64[ns]', name='datetime', length=231, freq=None)
In [16]: df2.index
Out[16]:
Index(['2019-11-03 00:00:00', '2019-11-04 00:00:00',
'2019-11-05 00:00:00', '2019-11-06 00:00:00',
'2019-11-07 00:00:00', '2019-11-08 00:00:00',
'2019-11-09 00:00:00', '2019-11-10 00:00:00',
'2019-11-11 00:00:00', '2019-11-12 00:00:00'],
dtype='object', name='datetime')
当我尝试通过 merged=pd.merge(df1, df2, left_on=['datetime'], right_on=['datetime'], how='left')
合并两个数据帧时,我收到一条消息 ValueError: You are trying to merge on datetime64[ns] and object columns. If you wish to proceed you should use pd.concat
请允许我也向您介绍一下这两个数据帧。
temperatures = [c for c in df1 if c.startswith('temp')]
df1['temp_mean']=df1[temperatures].mean(axis=1)
In [6]: df1.head(3)
Out[6]:
location temperature1 temperature2 wind rain temp_mean
datetime
2019-10-03 00:00:00 HK 18.72 18.78 SW 0.0 18.75
2019-10-03 01:00:00 HK 18.63 18.67 SW 0.1 18.65
2019-10-03 02:00:00 HK 18.29 18.31 SW 0.3 18.30
In [7]:df2
Out[7]:
values
datetime
2019-11-03 00:00:00 0.154286
2019-11-04 00:00:00 -5.094286
2019-11-05 00:00:00 1.432857
2019-11-06 00:00:00 0.227143
2019-11-07 00:00:00 0.160000
2019-11-08 00:00:00 1.300000
2019-11-09 00:00:00 0.308571
2019-11-10 00:00:00 0.442857
2019-11-11 00:00:00 0.241429
2019-11-12 00:00:00 NaN
显然,通过合并这两个数据框,我预计 df2 的 "values" 列将在末尾加入 df1,并且任何时候 != '00:00:00' 都将填充 NaN 和这些值将被放置在时间 == '00:00:00'。由于我收到错误和使用 pd.concat() 的建议,我输入 concated=pd.concat([df1, df2], axis=1, join='outer', ignore_index=False)
并在下面得到输出,其中列 "values" 在那里但完全是空的(我总是得到 NaNs ).
In [17]: concated.head(3)
Out[17]:
location temperature1 temperature2 wind rain temp_mean \
datetime
2019-10-03 00:00:00 HK 18.72 18.78 SW 0.0 18.75
2019-10-03 01:00:00 HK 18.63 18.67 SW 0.1 18.65
2019-10-03 02:00:00 HK 18.29 18.31 SW 0.3 18.30
values
datetime
2019-10-03 00:00:00 NaN
2019-10-03 01:00:00 NaN
2019-10-03 02:00:00 NaN
我不明白我在这里做错了什么以及如何使它起作用。
一开始,我不明白为什么 pd.merge()
不适用于我的数据框,然后我不明白为什么 pd.concat()
看不到这些值。
此时您的帮助将非常宝贵,在此先感谢您。
我相信你需要 merge
与 left_index=True
和 right_index=True
因为在两个 DataFrame
中匹配 DatetimeIndex
:
#convert to DatetimeIndex
df2.index = pd.to_datetime(df2.index)
df = pd.merge(df1, df2, left_index=True, right_index=True)
您正在尝试合并具有不同数据类型的日期时间列。
df1 : dtype='datetime64[ns]'
df2 : dtype='object'
解决方案:将任一数据类型转换为其他数据类型,
.dt.strftime(转换为字符串)
要么
pd.to_datetime(转换为日期时间数据类型)
我在需要加入两个数据帧时遇到了困难。我通常应用pd.merge()。但在这种情况下,我得到一个 ValueError,我被推荐使用 pd.concat()。所以,我的情况是这样的:
我有两个数据帧,df1 和 df2,下面是它们的索引。
In [15]: df1.index
Out[15]:
DatetimeIndex(['2019-11-03 00:00:00', '2019-11-03 01:00:00',
'2019-11-03 02:00:00', '2019-11-03 03:00:00',
...
'2019-11-12 11:00:00', '2019-11-12 12:00:00',
'2019-11-12 13:00:00', '2019-11-12 14:00:00'],
dtype='datetime64[ns]', name='datetime', length=231, freq=None)
In [16]: df2.index
Out[16]:
Index(['2019-11-03 00:00:00', '2019-11-04 00:00:00',
'2019-11-05 00:00:00', '2019-11-06 00:00:00',
'2019-11-07 00:00:00', '2019-11-08 00:00:00',
'2019-11-09 00:00:00', '2019-11-10 00:00:00',
'2019-11-11 00:00:00', '2019-11-12 00:00:00'],
dtype='object', name='datetime')
当我尝试通过 merged=pd.merge(df1, df2, left_on=['datetime'], right_on=['datetime'], how='left')
合并两个数据帧时,我收到一条消息 ValueError: You are trying to merge on datetime64[ns] and object columns. If you wish to proceed you should use pd.concat
请允许我也向您介绍一下这两个数据帧。
temperatures = [c for c in df1 if c.startswith('temp')]
df1['temp_mean']=df1[temperatures].mean(axis=1)
In [6]: df1.head(3)
Out[6]:
location temperature1 temperature2 wind rain temp_mean
datetime
2019-10-03 00:00:00 HK 18.72 18.78 SW 0.0 18.75
2019-10-03 01:00:00 HK 18.63 18.67 SW 0.1 18.65
2019-10-03 02:00:00 HK 18.29 18.31 SW 0.3 18.30
In [7]:df2
Out[7]:
values
datetime
2019-11-03 00:00:00 0.154286
2019-11-04 00:00:00 -5.094286
2019-11-05 00:00:00 1.432857
2019-11-06 00:00:00 0.227143
2019-11-07 00:00:00 0.160000
2019-11-08 00:00:00 1.300000
2019-11-09 00:00:00 0.308571
2019-11-10 00:00:00 0.442857
2019-11-11 00:00:00 0.241429
2019-11-12 00:00:00 NaN
显然,通过合并这两个数据框,我预计 df2 的 "values" 列将在末尾加入 df1,并且任何时候 != '00:00:00' 都将填充 NaN 和这些值将被放置在时间 == '00:00:00'。由于我收到错误和使用 pd.concat() 的建议,我输入 concated=pd.concat([df1, df2], axis=1, join='outer', ignore_index=False)
并在下面得到输出,其中列 "values" 在那里但完全是空的(我总是得到 NaNs ).
In [17]: concated.head(3)
Out[17]:
location temperature1 temperature2 wind rain temp_mean \
datetime
2019-10-03 00:00:00 HK 18.72 18.78 SW 0.0 18.75
2019-10-03 01:00:00 HK 18.63 18.67 SW 0.1 18.65
2019-10-03 02:00:00 HK 18.29 18.31 SW 0.3 18.30
values
datetime
2019-10-03 00:00:00 NaN
2019-10-03 01:00:00 NaN
2019-10-03 02:00:00 NaN
我不明白我在这里做错了什么以及如何使它起作用。
一开始,我不明白为什么 pd.merge()
不适用于我的数据框,然后我不明白为什么 pd.concat()
看不到这些值。
此时您的帮助将非常宝贵,在此先感谢您。
我相信你需要 merge
与 left_index=True
和 right_index=True
因为在两个 DataFrame
中匹配 DatetimeIndex
:
#convert to DatetimeIndex
df2.index = pd.to_datetime(df2.index)
df = pd.merge(df1, df2, left_index=True, right_index=True)
您正在尝试合并具有不同数据类型的日期时间列。
df1 : dtype='datetime64[ns]'
df2 : dtype='object'
解决方案:将任一数据类型转换为其他数据类型, .dt.strftime(转换为字符串) 要么 pd.to_datetime(转换为日期时间数据类型)