【问题标题】:How to filter the rows with multiple entries of MultiIndex level two?如何过滤具有 MultiIndex 级别 2 的多个条目的行?
【发布时间】:2020-11-29 12:08:53
【问题描述】:

我有一个带有 MultiIndex 的数据框 df。

df.columns
Index(['all', 'month', 'day', 'year'], dtype='object')
        all       month day year
  match             

7   0   10/24/89    10  24  89
8   0   3/7/86      3   7   86
    1   10          NaN NaN 10
9   0   4/10/71     4   10  71
10  0   5/11/85     5   11  85
    1   96          NaN NaN 96
    2   26          NaN NaN 26
11  0   10          NaN NaN 10
    1   4/09/75     4   09  75    
12  0   8/01/98     8   01  98

如何在 MultiIndex 级别 2 中选择具有超过 1 个条目的行?

例如,这里我需要第 8,10 和 11 行。

【问题讨论】:

  • 数据框是否有除 all、month 等之外的单独索引?价值为 7,8,9 ...等的那个?是否要根据该索引进行过滤? How can I select the rows with more than 1 entry at the MultiIndex level 2 是什么意思?是否要过滤级别 2 索引 = 全部?

标签: python pandas dataframe slice multi-index


【解决方案1】:

您可以在第一级索引处使用groupby.transform,并使用len。然后获取True,其中len 大于且等于(ge)您想要的值(此处为2)以获取您想要的布尔掩码并选择行。

print(df[df.groupby(level=0)['month'].transform(len).ge(2)])
                0  month   day  year
   match                            
8  0       3/7/86    3.0   7.0    86
   1           10    NaN   NaN    10
10 0      5/11/85    5.0  11.0    85
   1           96    NaN   NaN    96
   2           26    NaN   NaN    26
11 0           10    NaN   NaN    10
   1      4/09/75    4.0   9.0    75

在这里,我在 groupby 操作之后使用“月”作为列,但是数据框中的任何列都可以使用。

您也可以使用groupby.filter 并获得相同的结果:

print(df.groupby(level=0).filter(lambda x: len(x)>=2))

【讨论】:

  • 哦,我喜欢您使用 lambda 的第二个解决方案!谢谢,本。
猜你喜欢
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
相关资源
最近更新 更多