我有一个如下所示的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
== D
和Level
=='D1'的情况下,相同的ID将更改为D1
。 (2)如果Status
== C
和Level
=='D2',那么具有相同ID的所有行都将更改为D2
。 (3)如果Status
== I
和Level
=='D3',那么具有相同ID的所有行都将更改为D3
。 (4)如果每个人ID
(Status
== D
和Level
== D1
)AND({{ 1}} == Status
和C
== Level
)AND(D2
== Status
和I
== {{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>
答案 0 :(得分:0)
你需要|而不是或者你错过了(
df['mask'] = ((df['SP1'] != 'D')
| (df['SP2'] != 'D'))
pandas中的布尔运算符是|