在Python数据框中过滤两次

如何解决在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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?