Pandas:用于合并两个多索引 DataFrame 的类似 merge_asof 的解决方案?

Posted

技术标签:

【中文标题】Pandas:用于合并两个多索引 DataFrame 的类似 merge_asof 的解决方案?【英文标题】:Pandas: merge_asof-like solutions for merging two multi-indexed DataFrames? 【发布时间】:2018-09-13 09:28:27 【问题描述】:

我有两个数据框,df1df2 说,它们都是多索引的。

在第一个索引级别,两个数据帧共享相同的键(即df1.index.get_level_values(0)df2.index.get_level_values(0) 包含相同的元素)。这些键是无序的字符串,例如['foo','bar','baz']

在第二个索引级别,两个数据帧都有有序但不等间距的时间戳

我的问题如下。我想合并df1df2,这样,对于级别1的每个键,df2的值应该插入df1而不改变df1的顺序。

我尝试使用pd.mergepd.merge_asofpd.MultiIndex.searchsorted。从这些方法的描述中,似乎其中一个应该为我解决问题,但我不知道如何解决。理想情况下,我想找到一种解决方案,避免循环遍历index.get_level_values(0) 中的键,因为我的数据框可能会变大。

一些失败的说明尝试:

df_merged = pd.merge(left=df1.reset_index(), right=df2.reset_index(),
                     left_on=[['some_keys', 'timestamps_df1']], right_on=[['some_keys', 'timestamps_df2']],
                     suffixes=('', '_2')
                     ) # after sorting
# FAILED

df2.index.searchsorted(df1, side='right') # after sorting
# FAILED

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

根据您的描述,这里是merge_asof的解决方案

df_merged = pd.merge_asof(left=df1.reset_index(), right=df2.reset_index(),
                     left_on=['timestamps_df1'], right_on=['timestamps_df2'],by='some_keys',
                     suffixes=('', '_2')
                     )

【讨论】:

我有些惭愧,但我也很感激。我不会再忘记'by'键了!

以上是关于Pandas:用于合并两个多索引 DataFrame 的类似 merge_asof 的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

在多索引列上合并pandas数据帧

Python Pandas - 发布 concat 多索引数据帧

pandas:如何使用多索引运行数据透视?

熊猫数据框多索引合并

使用多索引列连接两个 pandas 数据框

Python Pandas:如何添加另一个名称的多索引?