【发布时间】:2020-09-10 03:44:30
【问题描述】:
对于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
如何过滤TYPE==I 所在的行,然后选择:对于此过滤后的数据帧中的每一行,从df 前面的所有行中选择具有相同ITEM_ID 但TYPE == O 的任何行。将这些对收集到一个数据框中。
我尝试使用df[df['TYPE'] == 'I'] 和
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 == I 之前加上 TYPE == O,否则,忽略它。但似乎TYPE == O 比TYPE == I 多。
【问题讨论】:
-
你的预期输出是什么?
-
嗨@BEN_YO,请查看已编辑的问题。