Python 使用.loc选择多索引级别的重复值

Python 使用.loc选择多索引级别的重复值,python,pandas,multi-index,Python,Pandas,Multi Index,首先,假设我有一个带有单个索引的熊猫数据帧。如果我使用.loc[]选择索引“A”两次,它将返回一个重复索引“A”两次的数据帧: df_1 = pd.DataFrame([1,2,3], index=['A','B','C'], columns=['Col_1']) df_1 Col_1 A 1 B 2 C 3 df_1.loc[['A','A','B']] Col_1 A 1 A 1 B 2 现在假设我们有一个具有多索引的数据帧。如果我使用.loc

首先,假设我有一个带有单个索引的熊猫数据帧。如果我使用
.loc[]
选择索引“A”两次,它将返回一个重复索引“A”两次的数据帧:

df_1 = pd.DataFrame([1,2,3], index=['A','B','C'], columns=['Col_1'])
df_1

    Col_1
A   1
B   2
C   3

df_1.loc[['A','A','B']]

    Col_1
A   1
A   1
B   2
现在假设我们有一个具有多索引的数据帧。如果我使用
.loc[]
选择索引“A”两次,它将只返回一次包含索引“A”的数据帧:

ix = pd.MultiIndex.from_product([['A', 'B', 'C'], ['foo', 'bar']], names=['Idx1', 'Idx2'])
data = np.arange(len(ix))
df_2 = pd.DataFrame(data, index=ix, columns=['Col_1'])
df_2

           Col_1
Idx1 Idx2       
A    foo       0
     bar       1
B    foo       2
     bar       3
C    foo       4
     bar       5

df_2.loc[['A','A','B']]


           Col_1
Idx1 Idx2   
A    foo       0
     bar       1
B    foo       2
     bar       3

是否有任何方法可以使用
.loc
选择多索引级别的重复值?

熊猫试图保持
多索引的级别唯一。当您将
loc
与引用
多索引第一级值的列表一起使用时,它将保持事物的唯一性。如果您想要一些不同的东西,您需要显式地使用元组

specific_index_values = (
    [('A', 'foo'), ('A', 'bar')] * 2 +
    [('B', 'foo'), ('B', 'bar')]
)

df_2.loc[specific_index_values, :]

           Col_1
Idx1 Idx2       
A    foo       0
     bar       1
     foo       0
     bar       1
B    foo       2
     bar       3

pandas.concat
我觉得这很恶心,但是

pd.concat([df_2.loc[[x]] for x in ['A', 'A', 'B']])

           Col_1
Idx1 Idx2       
A    foo       0
     bar       1
     foo       0
     bar       1
B    foo       2
     bar       3

因为A本身是重复的,所以第一层有两个A…
pd.concat(df_2.loc[x]表示x在['A','A','B'])
?foo/bar层的瓷砖顺序重要吗,还是只需要[(A,foo)(A,foo)(A,bar)(A,bar)]?我已经用另外一种方法更新了我的答案。我认为这是一个需要更多解释的主题,你可能已经知道了。多索引绝对是一个会让imo感到困惑的话题,如果你问我的话,它是pandas API的一个缺点。它会让人困惑,除了正常的困惑之外,还有一些bug。。。但我会为他们辩护到底。它们提供了一种机制,可以根据需要使数据帧具有尽可能多的维度。它们是不推荐使用Panel(imo)的主要原因,因为如果您有多索引,就不需要三维“数据帧”。熊猫数据帧优于R的数据帧的主要原因。。。。但是是的,很多解释都是有用的。