根据多个条件

时间:2015-07-06 22:17:28

标签: python csv pandas

我有一个如下所示的DataFrame:

ID   Status  SP1   SP2  Level
5       I     R     R   D3
5       C     R     R   D2
5       D     R     R   D1
6       C     R     R   D2
6       I     D     D   D4
6       I     S     D   D4
6       D     R     D   D1
7       I     R     D   D3
7       C     D     D   D4
7       D     D     D   D4

我想更改DataFrame,以便在(1) Status == DLevel =='D1'的情况下,相同的ID将更改为D1(2)如果Status == CLevel =='D2',那么具有相同ID的所有行都将更改为D2(3)如果Status == ILevel =='D3',那么具有相同ID的所有行都将更改为D3(4)如果每个人IDStatus == DLevel == D1)AND({{ 1}} == StatusC == Level)AND(D2 == StatusI == {{1} }),然后将Level更改为D3。因此,只有Level数字5符合条件,然后将级别更改为R.

我想要的输出是:

R

我已使用此代码完成了步骤1-3:

ID

我坚持使用的是数字(4),我想根据倍数和ID Status SP1 SP2 Level 5 I R R R 5 C R R R 5 D R R R 6 C R R D1 6 I D D D1 6 I S D D1 6 D R D D1 7 I R D D3 7 C D D D3 7 D D D D3 df['mask'] = ((df['STATUS'] == 'D') & df['Level'].isin(['D1'])) mask = df.groupby(['ID'])['mask'].transform('any') df.loc[mask, 'Level'] = 'D1' del df['mask'] df['mask'] = ((df['STATUS'] == 'C') & df['Level'].isin(['D2'])) mask = df.groupby(['ID'])['mask'].transform('any') df.loc[mask, 'Level'] = 'D2' del df['mask'] df['mask'] = ((df['STATUS'] == 'I') & df['Level'].isin(['D3'])) mask = df.groupby(['ID'])['mask'].transform('any') df.loc[mask, 'Level'] = 'D3' del df['mask'] print(df) 中的值更改为Level

编辑:

我试过的另一个代码应该可以达到类似的结果:

R

只要给定的df['mask'] = ((df['SP1'] != 'D') or df['SP2'] != 'D')) mask = df.groupby(['ID'])['mask'].transform('any') df.loc[mask, 'Level'] = 'R' del df['mask'] 没有D我就想ID = Level我在上面的示例中似乎有语法错误。< / p>

1 个答案:

答案 0 :(得分:0)

你需要|而不是或者你错过了(

df['mask'] = ((df['SP1'] != 'D') 
        | (df['SP2'] != 'D'))

pandas中的布尔运算符是|