在Python数据框中过滤两次

问题描述

对于df

    id          Date        ITEM_ID TYPE    GROUP
0   13710750    2019-07-01  SLM607  O       X
1   13710760    2019-07-01  SLM607  O       M
2   13710770    2019-07-03  SLM607  O       I
3   13710780    2019-09-03  SLM607  O       N
4   13667449    2019-08-02  887643  O       I
5   13667450    2019-08-02  792184  O       I
6   13728171    2019-09-17  SLM607  I       I
7   13667452    2019-08-02  794580  O       I

可复制的示例:

data = {'id': [13710750,13710760,13710770,13710780,13667449,13667450,13728171,13667452],'Date': ['2019-07-01','2019-07-01','2019-07-03','2019-09-03','2019-08-02','2019-09-17','2019-08-02'],'ITEM_ID': ['SLM607','SLM607','887643','792184','794580'],'TYPE': ['O','O','I','O'],'GROUP': ['X','M','N','I']}

df = pd.DataFrame(data)
df

如何过滤TYPE==I处的行,然后选择:对于此过滤数据框中的每一行,从前面的所有行中选择具有相同ITEM_IDTYPE == O的行df。在一个数据帧中收集这些对。

我尝试使用TYPE==I

选择df[df['TYPE'] == 'I']所在的行
item_list = df[df['TYPE'] == 'I']['ITEM_ID']
df[df.ITEM_ID.isin(item_list )]

过滤具有相同ITEM_ID的行。

然后,我尝试使用

过滤出具有相同'GROUP'的行
df[df.ITEM_ID.isin(item_list )].apply(lambda x: (x['GROUP'] ==x['GROUP'].shift()))

比较GROUP的值,但是shift()仅获得最后一行而不是所有先前的行,并且捕获了错误

KeyError: 'GROUP'

有没有办法做到这一点?


预期输出: 我想删除选定的行

    id          Date        ITEM_ID TYPE    GROUP
2   13710770    2019-07-03  SLM607  O       I
6   13728171    2019-09-17  SLM607  I       I

并获得

    id          Date        ITEM_ID TYPE    GROUP
0   13710750    2019-07-01  SLM607  O       X
1   13710760    2019-07-01  SLM607  O       M
3   13710780    2019-09-03  SLM607  O       N
4   13667449    2019-08-02  887643  O       I
5   13667450    2019-08-02  792184  O       I
7   13667452    2019-08-02  794580  O       I

更新:

尝试:

g1 = df.TYPE.eq('I').groupby(df['GROUP'])
g2 = df.TYPE.eq('I').groupby(df['ITEM_ID '])
out = df.loc[g2.transform('any') & g1.transform('any') ]
out.sort_values(by = ['ITEM_ID ','Date'])

并返回

        id          Date        ITEM_ID TYPE    GROUP  
11778   13681604    2019-08-13  101005  O       3.6000   
57196   13737698    2019-09-25  101005  O       0.6000  
95593   13784079    2019-10-29  101005  I       6.1110  
377127  14123909    2020-07-31  101005  O       6.1110  
28298   13702361    2019-08-28  101007  O       1.3260  
33314   13708339    2019-09-02  101007  I       1.3260  
33629   13708722    2019-09-02  101007  O       3.0240  
36599   13712390    2019-09-04  101007  I       3.0240  
123585  13818109    2019-11-21  101007  O       0.5775  
156128  13857644    2019-12-18  101007  O       0.3150  
162086  13864558    2020-01-03  101007  O       0.2500  
162088  13864560    2020-01-03  101007  O       0.2500  
171148  13875226    2020-01-13  101007  I       0.2500  
171149  13875227    2020-01-13  101007  I       0.2500  
171199  13875278    2020-01-13  101007  O       0.5000  
195655  13904483    2020-02-03  101007  O       0.5775  
228820  13944320    2020-03-04  101007  O       0.5250  
233908  13950372    2020-03-09  101007  O       0.5775  
282521  14008271    2020-04-24  101007  O       0.5775  
313485  14046206    2020-05-25  101007  O       0.5775  
319698  14053794    2020-06-01  101007  I       0.5775  
343402  14082826    2020-06-25  101007  O       0.5250  
353516  14095274    2020-07-07  101007  O       0.5250  
377217  14124005    2020-07-31  101007  O       0.5775  
395162  14145686    2020-08-24  101007  O       1.3260

期望输出成对出现,并且每对成对出现TYPE == O之前是TYPE == I,否则请忽略它。但是似乎TYPE == OTYPE == I多。

解决方法

您可以遮罩,然后在ffill()groupby

s = df.TYPE.eq('I')

mask = s.where(s).groupby(df['GROUP']).ffill()

df[mask.notna()]

输出:

         id        Date ITEM_ID TYPE GROUP
6  13728171  2019-09-17  SLM607    I     I
7  13667452  2019-08-02  794580    O     I

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...