如何合并2个数据帧,而不考虑行的时间戳?

时间:2019-06-09 18:20:12

标签: python pandas dataframe merge timestamp

我想合并2个具有相同行数的数据帧,而不考虑每行的时间戳。 我只是希望数据并排(它们已经排序)。 我试图摆脱时间戳,然后连接数据帧,但是没有成功。

这是第一个数据帧(如终端所示):

                              Open     High
Timestamp
2019-04-11 04:00:00+00:00  5143.50  5191.64
2019-04-11 05:00:00+00:00  5180.18  5183.11

这是第二个数据帧:

                            Open_2h   High_2h
Timestamp
2019-04-11 04:00:00+00:00     5100       5300
2019-04-11 06:00:00+00:00     5200       5400

这是我想要得到的结果:

                              Open     High  Open_2h  High_2h
Timestamp
2019-04-11 04:00:00+00:00  5143.50  5191.64     5100     5300
2019-04-11 05:00:00+00:00  5180.18  5183.11     5200     5400

所以我尝试了以下代码:


result = pd.DataFrame()
df1.reset_index()
df2.reset_index()
result = pd.concat([df1, df2], axis=1 , sort=False)

我也尝试过:


result = pd.DataFrame()
df1.reset_index()
df2.reset_index()
result = df1.join(df2)

我还预先尝试在df1和df2中强制使用新索引:


indexlist = list(range(0,2))
df1.loc[:,'Index'] = indexlist
df1.set_index('Index')
df2.loc[:,'Index'] = indexlist
df2.set_index('Index')

但是时间戳数据仍然是熊猫进行“ join”或“ concatenate”操作所依赖的索引。

使用上面的任何代码,这就是我得到的:

                              Open     High  Open_2h  High_2h
Timestamp
2019-04-11 04:00:00+00:00  5143.50  5191.64     5100     5300
2019-04-11 05:00:00+00:00  5180.18  5183.11      NaN      NaN
2019-04-11 06:00:00+00:00      NaN      NaN     5200     5400

我尝试了下面指示的merge_asof解决方案,但是使用以下数据,出现重复的行:

df1

                           Open     High
Timestamp
2019-04-11 03:00:00+00:00  3000     3100
2019-04-11 04:00:00+00:00  4000     4100
2019-04-11 05:00:00+00:00  5000     5100

df2

                          Open_2h     High_2h
Timestamp
2019-04-11 00:00:00+00:00   0500         0600
2019-04-11 02:00:00+00:00   2500         2600
2019-04-11 04:00:00+00:00   4500         4600

我得到:

                             Open     High  Open_2h  High_2h
Timestamp        
2019-04-11 03:00:00+00:00        3000     3100     2500     2600                                
2019-04-11 04:00:00+00:00        4000     4100     4500     4600
2019-04-11 05:00:00+00:00        5000     5100     4500     4600

两个数据帧之间的时间戳仍然保持同步,并且在df2中找不到相应的timpestamp时,将复制先前的值。

有人可以帮我摆脱这些数据帧的时间戳以进行这种串联吗?

在此先感谢您的帮助。

最诚挚的问候,

皮埃尔

3 个答案:

答案 0 :(得分:1)

这是merge_asof()

pd.merge_asof(df1.reset_index(),df2.reset_index(),on='Timestamp').set_index('Timestamp')

                             Open     High  Open_2h  High_2h
Timestamp                                                    
2019-04-11 04:00:00+00:00  5143.50  5191.64     5100     5300
2019-04-11 05:00:00+00:00  5180.18  5183.11     5100     5300

如果您不希望考虑第二个df的索引:

df1.reset_index().combine_first(df2.reset_index(drop=True)).set_index('Timestamp')

                              High  High_2h     Open  Open_2h
Timestamp                                                    
2019-04-11 04:00:00+00:00  5191.64   5300.0  5143.50   5100.0
2019-04-11 05:00:00+00:00  5183.11   5400.0  5180.18   5200.0

答案 1 :(得分:0)

您可以做到

df3 = pd.merge(df1.reset_index(),df2.reset_index(),how='outer',left_on=['Timestamp'],right_on=['Timestamp'])

答案 2 :(得分:0)

好的,我认为“ reset_index()”中缺少的部分是“ inplace = True”。 因此,以下代码可以完成这项工作:


df1.reset_index(drop=True, inplace=True)
df2.reset_index(drop=True, inplace=True)
result = df1.join(df2, sort=False)

Pffouuuhh 一个下午! ;)

感谢大家的帮助!

最好

皮埃罗特