【问题标题】:groupby and selecting in pandas分组并在熊猫中选择
【发布时间】:2015-02-17 19:02:40
【问题描述】:

我正在尝试根据更改列删除表中的一些行。

id  subindex    change
A1      1           0
A1      2           1
A1      3           12
A1      4           0
A1      5           15
A1      6           1
A2      1           0
A2      2           11
A2      3           1
A2      4           0   

在一个子组中(Id 相同)当变化大于 10 时,我想删除后续行。所以表格是:

 id subindex    change
A1      1           0
A1      2           1
A2      1           0

我所做的是一个 groupby 来确定子表应该被剪切的位置:

df['cut_position']=df[df.change >= 10].groupby('id')['subindex'].transform(lambda x: x.min())

给出:

id  subindex    change      cut_position
A1      1           0           0
A1      2           1           0
A1      3           12          3
A1      4           0           0
A1      5           15          0
A1      6           1           0   
A2      1           0           0
A2      2           11          2
A2      3           1           0
A2      4           0           0

那么 groupby('id') 应该很容易做到,但我在尝试获取该表时遇到问题:

id  subindex    change      cut_position
A1      1           0           0
A1      2           1           0
A1      3           12          ToRemove_3
A1      4           0           ToRemove_0
A1      5           15          ToRemove_0
A1      6           1           ToRemove_0  
A2      1           0           0
A2      2           11          ToRemove_2
A2      3           1           ToRemove_0
A2      4           0           ToRemove_0

在编写可以生成表格的代码时,我得到:

df.groupby('id')[df['subindex'] >= df['cut_position'].max()].map(lambda x : 'ToRemove_' + x)

KeyError: '未找到列:假,真'

注意:我做了一些有效的事情,但是花费了太多时间......

【问题讨论】:

  • 变化 10 表示从这一点及以下的数据质量有所减弱。因此,我想删除更改为 10 或更多的数据以下的所有数据。
  • 谢谢萨拉。再次查看您的问题后,我删除了我的评论

标签: select pandas group-by


【解决方案1】:

对这种方法不是 100% 满意,但您可以尝试一下。

考虑到你的框架

id  subindex    change
A1      1           0
A1      2           1
A1      3           12
A1      4           0
A1      5           15
A1      6           1
A2      1           0
A2      2           11
A2      3           1
A2      4           0 

然后创建一个框架,每个 'id' 的第一行大于 10

rowindex = df['change'] > 10
greaterThan10 = df[rowindex].groupby('id',as_index=False).first()

比原始帧的 merge() 和大于 10

dfKeep = pd.merge(df,greaterThan10,how='left',on=['id'],suffixes=['','_cut'])

然后为'keepers'过滤新框架

mask = (dfKeep['subindex'] < dfKeep['subindex_cut']) 
dfKeep[mask][['id','subindex','change']]

给你

    id  subindex    change
0   A1  1           0
1   A1  2           1
6   A2  1           0

【讨论】:

  • 感谢 Bob,它做到了,而且速度非常快。
  • 好交易。感谢您的反馈
猜你喜欢
  • 2017-05-22
  • 2020-05-18
  • 1970-01-01
  • 2020-09-18
  • 2021-09-04
  • 2018-11-07
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多