如何解决在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_ID
但TYPE == 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 == O
比TYPE == 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