【问题标题】:Filter Dataframe Based on Differnce Between Multiple Columns根据多列之间的差异过滤数据框
【发布时间】:2022-01-17 06:14:30
【问题描述】:

我正在处理以下数据框,df

name         val_1       val_2      val_3

AAA           20         25          30       
BBB           15         20          35
CCC           25         40          45
DDD           20         20          25

我只需要保留任何 val 列比之前的 val 列增加 10 以上的名称。如果一列比前一列增加了不到 10 或者甚至没有增加,我们需要删除该名称。

期望的输出:

name

BBB #val3 increases by 15  
CCC #val2 increases by 15 

最聪明的做法是什么?任何建议,将不胜感激。谢谢!

【问题讨论】:

  • val_3的第一个值不应该是25吗?

标签: python pandas dataframe data-manipulation


【解决方案1】:
subset = df[df.filter(like='val_').T.diff().gt(10).any()]

输出:

>>> subset
  name  val_1  val_2  val_3
1  BBB     15     20     35
2  CCC     25     40     45

【讨论】:

  • 嗨@user17242583,谢谢你这么好的解释。考虑到连续列是否增加 10,值 20 或 30 不会有问题。
  • 啊,我看到了@Roy,所以 BBB 被 35(val_3BBB)选择为 15 大于 20(val_1AAA)?
  • 还是因为 BBB 的 val_3 比 BBB 的 val_2 大 15 而选择了 BBB?
  • @Roy 请再次检查我的答案。我想这就是你要找的。​​span>
【解决方案2】:

按照我的理解,当两行在所有列上的差异至少为 10 时,您希望保留两行。

为此,您需要使用diff+ge+all 构建一个掩码,并将该掩码与其shift 结合起来:

m = df.filter(like='val_').diff().ge(10).all(1)
out = df[m|m.shift(-1)]

输出:

  name  val_1  val_2  val_3
1  BBB     15     20     35
2  CCC     25     40     45

【讨论】:

  • 嗨@mozway,感谢您的回复。欣赏。我的意思是如果 2 个并列的列增加 10 或不增加。
  • @Roy 那么你的问题还不清楚,对于 BBB 来说,val_1 和 val_2 之间的增长还不够(只有 5 个)
  • 对不起@mozway。我的意思是,对于 BBB,val_3 从 val_2 增加 15
  • 所以这不是连续增加(从某种意义上说,至少从 10 开始增加),那么其他答案有什么问题?如果它适合你,你应该接受它;)
  • 嗨@mozway,我仍然不确定all()。我稍微更新了问题:stackoverflow.com/questions/70340973/…
猜你喜欢
  • 2021-08-19
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多