通过逻辑过滤数据帧

时间:2020-10-12 10:30:43

标签: python pandas

我有这个数据框:

      MAT MAT_IN  SER D8
0   X     A1  Yes  -
1   X     A2   No  X
2   X     A3   No  X
3   X     A4  Yes  X
4   Y     B1   No  -
5   Y     B2   No  -
6   Y     B3   No  -
7   Y     B4   No  -
8   Y     B5   No  -
9   Z     K1  Yes  -
10   Z     K2   No  -
11   Z     K3   No  X
12   Z     K4  Yes  X

我要在其中创建过滤器的地方,所以只得到第一行。过滤器具有以下条件:

  • 列“ Ser” =“是”和列“ D8” =“-”
  • 该组中的其余行(在此例中为“ MAT”列,为X)必须具有“ D8” =“ X”列

如何在数据框中应用此类过滤器?

我的代码:

import pandas as pd

data = {'MAT':['X','X','X','X','Y','Y','Y','Y','Y','Z','Z','Z','Z'],
       'MAT_IN':['A1','A2','A3','A4','B1','B2','B3','B4','B5','K1','K2','K3','K4'],
       'SER':['Yes','No','No','Yes','No','No','No','No','No','Yes','No','No','Yes'],
       'D8':['-','X','X','X','-','-','-','-','-','-','-','X','X']}

df1=pd.DataFrame(data, columns=['MAT','MAT_IN','SER','D8'])

df1

任何预期结果在D99列中:

MAT MAT_IN  SER D8 D99
0   X     A1  Yes  -  X
1   X     A2   No  X  -
2   X     A3   No  X  -
3   X     A4  Yes  X  -
4   Y     B1   No  -  -
5   Y     B2   No  -  -
6   Y     B3   No  -  -
7   Y     B4   No  -  -
8   Y     B5   No  -  -
9   Z     K1  Yes  -  -
10   Z     K2   No  -  -
11   Z     K3   No  X  -
12   Z     K4  Yes  X  -

1 个答案:

答案 0 :(得分:0)

通过方法Series.duplicated的倒置掩码为按位&的{​​{1}}创建组掩码,以比较相等的组链接的第一个值,并为最后删除先链接最后一个掩码AND每组按mask2行,按duplicated比较并按DataFrameGroupBy.all测试每组是否所有X都没有第一个,对于具有与原始添加Series.map

X