如何将数据帧转换为 pandas IndexSlice 以索引另一个 MultiIndex 数据帧
How to convert a dataframe into a pandas IndexSlice to index another MultiIndex dataframe
我有以下 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]], :]
这会 return:
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。
并且我在我的代码中做了类似的事情,但是对于我的目的来说它花费的时间太长了。
df_list = [df1.loc[(v[0], slice(None), v[1]), :] for r, v in df2.iterrows()]
df_sliced = pd.concat(df_list)
所以我希望使用 pd.IndexSlice 或其他替代方法会更快。
非常感谢!
我有以下 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]], :]
这会 return:
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。
df_list = [df1.loc[(v[0], slice(None), v[1]), :] for r, v in df2.iterrows()]
df_sliced = pd.concat(df_list)
所以我希望使用 pd.IndexSlice 或其他替代方法会更快。
非常感谢!