首页 > 解决方案 > 使用 pd.merge_asof() 时索引丢失

问题描述

我对 pd.merge_asof 和索引有疑问。

首先,我正在创建一个包含我需要的列/数据的数据框,然后按如下方式对其进行排序:

df1 = df[['A','B','C']].sort_values('B')

df1.head()

头部显示来自 df 的索引已结转到 df1(索引为日期)。

接下来我执行 pd.merge_asof 如下:

df2 = pd.merge_asof(df, df3, left_on='B', right_on='Z')

但是,如果我检查 df2 的头部,则日期索引现在丢失了。我需要将其转入 df2(来自 df/df1),因为我会将数据重新排序为日期顺序(这对我正在做的事情很重要)。

任何想法我可以如何以简单的方式做到这一点?

一如既往地感谢你!

保罗

标签: pythonpandasindexingmerge

解决方案


当您合并并且不合并原始索引的任何部分时,索引将失去其相关性。您连接来自不同 DataFrame 的行,那么您如何知道要选择哪个索引?

样本数据

import pandas as pd
df1 = pd.DataFrame({'foo': [1,2,3]}, index=list('abc'))
df2 = pd.DataFrame({'bar': [1,2,3]}, index=list('xyz'))

pd.merge_asof(df1, df2, left_on='foo', right_on='bar')

   foo  bar
0    1    1    # Should the index be 'a' or 'x'?
1    2    2    #                     'b' or 'y'?
2    3    3    #                     'c' or 'z'?

如果您需要索引在合并中出现,请通过将其设为一列来消除歧义reset_index

pd.merge_asof(df1.reset_index(), df2.reset_index(), left_on='foo', right_on='bar')

  index_x  foo index_y  bar
0       a    1       x    1
1       b    2       y    2
2       c    3       z    3

推荐阅读