【问题标题】:Selecting repeated values of a multi-index level with .loc使用 .loc 选择多索引级别的重复值
【发布时间】:2020-02-17 20:37:44
【问题描述】:

首先让我们假设我有一个带有单个索引的 pandas 数据框。如果我使用.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选择多索引级别的重复值?

【问题讨论】:

  • 由于 A 本身是重复的,所以第一级有两个 A ...
  • pd.concat(df_2.loc[x] for x in ['A','A','B'])?
  • foo/bar 级别的 tile 排序是否重要,还是有 [(A, foo) (A, foo) (A, bar) (A, bar)] 就足够了?跨度>
  • 我用另一种方法更新了我的答案。

标签: python pandas multi-index


【解决方案1】:

Pandas 试图保持MultiIndex 的级别唯一。当您将loc 与引用MultiIndex 第一级值的列表一起使用时,它将保持唯一性。如果你想要不同的东西,你需要明确并使用元组。

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

【讨论】:

  • 我认为这是一个可以使用更多解释的主题,您可能已经掌握了知识。 MultiIndex 绝对是一个让 imo 感到困惑的话题,如果你问我,它也是 pandas API 的缺点之一。
  • 这可能会令人困惑,除了普通的混乱之外,还有一些错误......但我会为他们辩护到最后。它们提供了一种机制,可以根据您的需要制作多维数据框。它们是不推荐使用 Panel 的主要原因(imo),因为如果您有 MultiIndex,则不需要 3-D“数据框”。而且,Pandas 数据框优于 R 的数据框的主要原因......但是,是的,很多解释都会有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 2021-12-03
  • 2021-10-14
相关资源
最近更新 更多