Python / Pands:groupby /查找特定行/将所有行都放在下面

时间:2018-12-14 09:53:10

标签: python pandas

我有一个数据框-我想在每个组中删除特定的行(“ id”):

id - month - max 
1 - 112016 - 41
1 - 012017 - 46
1 - 022017 - 156
1 - 032017 - 164
1 - 042017 - 51
2 - 042017 - 26
2 - 052017 - 156
2 - 062017 - 17
  • 对于每个“ id”,找到第一行的位置(按“ month”排序),其中“ max”为> 62
  • 保留上方(此组内)的所有行,删除其余行

预期结果:

id - month - max 
1 - 112016 - 41
1 - 012017 - 46
2 - 042017 - 26

我能够识别出每组必须删除的第一行,但从那以后我就陷入了困境:

df[df.max > 62].sort_values(['month'], ascending=[True]).groupby('id', as_index=False).first()

如何摆脱行?

最好的问候, 大卫

2 个答案:

答案 0 :(得分:1)

使用:

#convert to datetimes
df['month'] = pd.to_datetime(df['month'], format='%m%Y')
#sorting per groups if necessary
df = df.sort_values(['id','month'])
#comopare by gt (>) for cumulative sum per groups and filter equal 0
df1= df[df['max'].gt(62).groupby(df['id']).cumsum().eq(0)]
print (df1)

   id      month  max
0   1 2016-11-01   41
1   1 2017-01-01   46

或者如果还需要第一个值>62,则使用自定义函数:

#convert to datetimes
df['month'] = pd.to_datetime(df['month'], format='%m%Y')
#sorting per groups if necessary
df = df.sort_values(['id','month'])

def f(x):
    m = x['max'].gt(62) 
    first = m[m].index[0]
    x = x.loc[ :first]
    return x

df = df.groupby('id', group_keys=False).apply(f)
print (df)

   id      month  max
0   1 2016-11-01   41
1   1 2017-01-01   46
2   1 2017-02-01  156
5   2 2017-04-01   83

答案 1 :(得分:0)

import pandas as pd
datadict = {
        'id': [1,1,1,1,1,2,2,2],
        'max': [41,46,156,164,51,83,156,17],
        'month': ['112016', '012017', '022017', '032017', '042017', '042017', '052017', '062017'],
        }

df = pd.DataFrame(datadict)
print (df)
   id  max   month
0   1   41  112016
1   1   46  012017
2   1  156  022017
3   1  164  032017
4   1   51  042017
5   2   83  042017
6   2  156  052017
7   2   17  062017

df = df.loc[df['max']>62,:]
print (df)
   id  max   month
2   1  156  022017
3   1  164  032017
5   2   83  042017
6   2  156  052017