在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-08-02', '2019-09-17', '2019-08-02'],

        'ITEM_ID': ['SLM607', 'SLM607', 'SLM607', 'SLM607', '887643', '792184', 'SLM607', '794580'],

        'TYPE': ['O', 'O', 'O', 'O', 'O', 'O', 'I', 'O'],

        'GROUP': ['X', 'M', 'I','N','I','I','I', 'I']}


df = pd.DataFrame(data)

df

如何删除具有相同值的行对ITEM_ID和GROUP,但一个具有Ofor 的TYPE行先出现,另一行具有Ifor 的TYPE值稍后出现?


预期结果:


    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


烙印99
浏览 109回答 1
1回答

隔江千里

shift和filterout = df.groupby(['ITEM_ID','GROUP']).filter(lambda x : ~(x['TYPE'].eq('I') & x['TYPE'].shift().eq('O')).any())Out[7]:          id        Date ITEM_ID TYPE GROUP0  13710750  2019-07-01  SLM607    O     X1  13710760  2019-07-01  SLM607    O     M3  13710780  2019-09-03  SLM607    O     N4  13667449  2019-08-02  887643    O     I5  13667450  2019-08-02  792184    O     I7  13667452  2019-08-02  794580    O     I
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python