查找有错误的常见子索引值



如何在索引 A = 'a' 的两个数据帧之间找到子索引(在本例中为 B 列(的通用值?

import pandas as pd
df = pd.DataFrame({'Do': [0, 0, 0, 0, 0, 0], 'Ri': [0, 0, 0, 0, 0, 0],
'Mi': [0, 0, 0, 0, 0, 0],'A':['a', 'a', 'a', 'a', 'b', 'b'],
'B': [1, 2, 2, 3, 4, 5]})
df.set_index(['A', 'B'])

        Do  Ri  Mi
A   B           
a   1   0   0   0
    2   0   0   0
    2   0   0   0
    3   0   0   0
b   4   0   0   0
    5   0   0   0
df2 = pd.DataFrame({'Do': [0, 0, 0, 0, 0, 0], 'Ri': [0, 0, 0, 0, 0, 0],
'Mi': [0, 0, 0, 0, 0, 0], 'A':['a', 'a', 'a', 'a', 'b', 'b'],
'B': [3, 3, 4, 6, 7, 8]})
df2.set_index(['A', 'B'])
        Do  Ri  Mi
A   B           
a   3   0   0   0
    3   0   0   0
    4   0   0   0
    6   0   0   0
b   7   0   0   0
    8   0   0   0

目前我有:

df_a = df.loc[['a']].sort_index(level='B')
df2_a = df2.loc[['a']].sort_index(level='B')
df_a_b = df_a.index.levels[1].tolist()
df2_a_n = df2_a.index.levels[1].tolist()
set(df_a_b) & set(df2_a_n)

但这似乎取自索引 A = 'a' 和 A = 'b'

我注意到 loc['a'] 或 loc[['a']] 会导致不同的 dfs,我不确定这是否相关,但是 [['a']] 与 ['a'] 有什么意义?

对于单个重叠,请在每个 DataFrme 子集化后设置交集:

set(df.loc['a'].index) & set(df2.loc['a'].index)
#{3}

merge也有效,但对于单个十字路口来说有点矫枉过正。另一方面,如果您想一次完成所有交叉点,请使用 .merge + groupby

#Single
df.loc['a'].merge(df2.loc['a'], left_index=True, right_index=True).index.unique()
#Int64Index([3], dtype='int64', name='B')
#All
df.merge(df2, on=['A', 'B']).reset_index().groupby('A').B.unique()
#A
#a    [3]
#Name: B, dtype: object

为了解释您的错误,您找到了levels的交集,但您想要的是电平值的交集。您当前的代码应更改为:

df_a = df.loc[['a']].sort_index(level='B')
df2_a = df2.loc[['a']].sort_index(level='B')
#                   Get The Level Values, not the Level IDs
df_a_b = df_a.index.get_level_values(1).tolist()
df2_a_n = df2_a.index.get_level_values(1).tolist()
set(df_a_b) & set(df2_a_n)
#{3}

最新更新