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

时间:2019-04-25 16:25:37

标签: python pandas

您将如何找到索引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']?

1 个答案:

答案 0 :(得分:3)

对于单个重叠,请在对每个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}