【问题标题】:filter pandas dataframe on one level of a multi level index在多级索引的一级过滤熊猫数据框
【发布时间】:2018-05-23 19:51:56
【问题描述】:

如果我有一个带有多级索引的 pandas 数据框,我如何按该索引的一个级别进行过滤。例如:

df = pd.DataFrame({"id": [1,2,1,2], "time": [1, 1, 2, 2], "val": [1,2,3,4]})
df.set_index(keys=["id", "time"], inplace=True)

我想做这样的事情:

df[df["time"] > 1]

但time 不再是一列。我可以将其保留为一列,但我不想拖拽数据副本。

【问题讨论】:

标签: python pandas


【解决方案1】:
In [17]: df[df.index.get_level_values('time') > 1]
Out[17]:
         val
id time
1  2       3
2  2       4

@piRSquared 的解决方案虽然更惯用...

【讨论】:

  • 有趣,这与我猜到的答案应该是一样的。请记住,查询是标准做法
  • ^ 正是我的想法。对于该方法的初学者来说,惯用方法变得复杂(但谁知道过滤 df 的常用方法),尤其是当您想与 .isin() 或类似的东西进行比较时。我以为它不会开箱即用,因为pandas.pydata.org/pandas-docs/stable/reference/api/… 上没有足够的插图,但后来我找到了stackoverflow.com/a/33991869/1332401(所以df[df.A.isin(list_ids)] vs df.query('A in @list_ids))
【解决方案2】:

query

df.query('time > 1')

         val
id time     
1  2       3
2  2       4

IndexSlice

DataFrame 索引必须是 lexsorted

df.sort_index().loc[pd.IndexSlice[:, 2:], :]

         val
id time     
1  2       3
2  2       4

【讨论】:

  • 真的吗?您必须传递字符串而不是在代码中使用它?
  • 这是一种方法。碰巧也是一个快速的大规模。 stackoverflow.com/a/46165056/2336654
  • @Alex 注意; level = 'time', df.query("@level > 1") 适用于变量。
  • @piRSquared:好吧,我对查询的东西很满意。看起来对我来说是最好的方式。熊猫世界中的人们通常只是在代码中动态构建字符串并传递这些字符串吗?具有讽刺意味的是,这种事情在 R 中往往不鼓励
  • @coldspeed:很好的提示,刚刚在文档中查看,谢谢!
猜你喜欢
  • 2017-06-03
  • 2021-08-01
  • 1970-01-01
  • 2015-05-28
  • 2013-12-04
  • 2017-10-30
  • 2018-08-24
  • 1970-01-01
  • 2017-09-21
相关资源
最近更新 更多