【问题标题】:Python Pandas : find n in a sorted multindex dataframe and return [0:n+1] for each level 1 indexPython Pandas:在排序的多索引数据框中找到 n 并为每个级别 1 索引返回 [0:n+1]
【发布时间】:2021-12-21 04:12:56
【问题描述】:

我对我认为的简单过滤任务有一些问题。 我们有一个大致具有这种形状的数据:

name item cumsum
name1 item 1 0.05
item 2 0.10
item 3 0.31
name2 item 1 0.02
item 2 0.07
name3 item 1 0.01
item 2 0.07
item 3 0.21
name4 item 1 0.03
item 2 0.12
item 3 0.21
item 4 0.35

我想要返回包含小于 0.2 的项目和正上方项目的数据框。这是我想要作为输出的表格:

name item cumsum
name1 item 1 0.05
item 2 0.10
item 3 0.31
name2 item 1 0.02
item 2 0.07
name3 item 1 0.01
item 2 0.07
item 3 0.21
name4 item 1 0.03
item 2 0.12
item 3 0.21

我尝试为每个“名称”找到 cumsum 大于 0.2 的“项目”,然后返回整个范围,索引为:

    df = df.loc['name1']
    idx = df.loc[df['cumsum'] > 0.2].index[0]
    iidx = df.index.get_loc(idx) + 1
    df = df.iloc[:iidx]

并为每个“名称”执行此操作。但是,这对于 name2 失败。

有人可以帮忙吗?

【问题讨论】:

  • 我不明白...为什么 name4 - item4 被删除了?
  • 您好,感谢您的提问!我想删除这一行,因为第 3 项是大于 0.2 的第一项。我对预期输出的描述做了一些改动。

标签: python pandas filtering multi-index


【解决方案1】:

| 用于按位OR,按每组移位DataFrameGroupBy.shift 的掩码:

m = (df['cumsum'] < 0.2)
df = df[m | m.groupby(level=0).shift(fill_value=False)]
print (df)
              cumsum
name  item          
name1 item 1    0.05
      item 2    0.10
      item 3    0.31
name2 item 1    0.02
      item 2    0.07
name3 item 1    0.01
      item 2    0.07
      item 3    0.21
name4 item 1    0.03
      item 2    0.12
      item 3    0.21

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 2014-09-05
    • 2018-10-26
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多