【问题标题】:Filter twice in Python dataframe在 Python 数据框中过滤两次
【发布时间】: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_IDTYPE == 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 == OTYPE == I 多。

【问题讨论】:

  • 你的预期输出是什么?
  • 嗨@BEN_YO,请查看已编辑的问题。

标签: python pandas dataframe


【解决方案1】:

你可以屏蔽然后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

【讨论】:

  • 感谢您的解决方案。能否请您简要解释一下第 2 行和第 3 行?
  • 嗨,Quang,我认为ITEM_ID 必须相同才能成为一对。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2019-12-21
  • 2020-08-16
相关资源
最近更新 更多