【发布时间】:2021-12-01 04:35:20
【问题描述】:
我有以下 2 个数据框 df1 和 df2:
import pandas as pd
m_idx = pd.MultiIndex.from_product([range(3), range(3, 6), range(6, 8)])
m_idx.names = ['a', 'b', 'c']
df1 = pd.DataFrame(None, index=m_idx, columns=['x1', 'x2', 'x3'])
df1.loc[:, 'x1'] = m_idx.get_level_values('a') + m_idx.get_level_values('b') + m_idx.get_level_values('c')
df1.loc[:, 'x2'] = df1.loc[:, 'x1'] * 2
df1.loc[:, 'x3'] = df1.loc[:, 'x1'] * 3
df2 = pd.DataFrame({'a': [0, 2], 'c': [6, 6]})
df1:
x1 x2 x3
a b c
0 3 6 9 18 27
7 10 20 30
4 6 10 20 30
7 11 22 33
5 6 11 22 33
7 12 24 36
1 3 6 10 20 30
7 11 22 33
4 6 11 22 33
7 12 24 36
5 6 12 24 36
7 13 26 39
2 3 6 11 22 33
7 12 24 36
4 6 12 24 36
7 13 26 39
5 6 13 26 39
7 14 28 42
df2:
a c
0 0 6
1 2 6
如何将 df2 转换为可用于查找 df1 的索引,其中 df2 的列名是级别,并且在每一行中,您都有要从 df1 索引中获取的键组合。
或者换句话说,我怎样才能将 df2 转换成相当于
的东西df1.loc[pd.IndexSlice[[0, 2], :, [6, 6]], :]
会返回:
x1 x2 x3
a b c
0 3 6 9 18 27
4 6 10 20 30
5 6 11 22 33
2 3 6 11 22 33
4 6 12 24 36
5 6 13 26 39
这是我实际尝试解决的一个非常简化和小规模的版本。所以真的很想动态创建 pd.IndexSlice。
I see a separate question that suggested this 并且我在我的代码中做了类似的事情,但是对于我的目的来说这需要很长时间。
df_list = [df1.loc[(v[0], slice(None), v[1]), :] for r, v in df2.iterrows()]
df_sliced = pd.concat(df_list)
所以我希望使用 pd.IndexSlice 或其他替代方法可以更快。
非常感谢!
【问题讨论】:
标签: python pandas multi-index