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的数据帧的主要原因。。。。但是是的,很多解释都是有用的。