groupby 并在 pandas 中选择
groupby and selecting in pandas
我正在尝试根据更改列删除 table 中的一些行。
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时,我想删除后面的行。所以 table 将是:
id subindex change
A1 1 0
A1 2 1
A2 1 0
我所做的是一个 groupby 来确定子 table 应该被剪切的位置:
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') 应该很容易做到,但我在尝试获得 table:
时遇到了问题
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
在编写可以生成 table 的代码时,我得到:
df.groupby('id')[df['subindex'] >= df['cut_position'].max()].map(lambda x : 'ToRemove_' + x)
按键错误:'Columns not found: False, True'
注意:我做了一些有用的事情,但是它花了太多时间...
对这种方法不是 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() 和 greaterThan10
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
我正在尝试根据更改列删除 table 中的一些行。
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时,我想删除后面的行。所以 table 将是:
id subindex change
A1 1 0
A1 2 1
A2 1 0
我所做的是一个 groupby 来确定子 table 应该被剪切的位置:
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') 应该很容易做到,但我在尝试获得 table:
时遇到了问题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
在编写可以生成 table 的代码时,我得到:
df.groupby('id')[df['subindex'] >= df['cut_position'].max()].map(lambda x : 'ToRemove_' + x)
按键错误:'Columns not found: False, True'
注意:我做了一些有用的事情,但是它花了太多时间...
对这种方法不是 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() 和 greaterThan10
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