我有一个CSV文件,如下所示:
ID Status SP1 SP2
5 I D R
5 C D D
5 C R D
5 I S D
5 D R S
6 C R R
6 I D D
6 I S D
6 D D D
7 I R D
7 C D D
7 D D D
我想编写一个代码,如果Status == D和SP1或SP2 == R,则创建一个名为Level的新列,并用D1填充适用ID中的所有行。如果SP1或SP2没有R,状态为D,但如果Status == C和SP1或SP2 == R,则创建一个新列,并用D2填充适用ID的所有行。如果SP1或SP2没有R,但Status == I和SP1或SP2 == R则创建一个新列,并使用D3填充所有具有适用ID的行。否则返回D4
我想要的输出是:
ID Status SP1 SP2 Level
5 I D R D1
5 C D D D1
5 C R D D1
5 I S D D1
5 D R S D1
6 C R R D2
6 I D D D2
6 I S D D2
6 D D D D2
7 I R D D3
7 C D D D3
7 D D D D3
我目前正在尝试这样的代码:
df['Level']=np.nan
def f(x):
if x['STATUS'] == 'D' and x['SP1'] == 'R' or x['SP2']=='R': return 'D1'
elif x['STATUS'] == 'C' and x['SP1'] == 'R' or x['SP2']=='R': return 'D2'
elif x['STATUS'] == 'I' and x['SP1'] == 'R' or x['SP2']=='R': return 'D3'
else: return 'D4'
df['Level'] = df.apply(f, axis=1)
print df
但这会返回:
ID STATUS SP1 SP2 Level
0 5 I D R D1
1 5 C D D D4
2 5 C R D D2
3 5 I S D D4
4 5 D R S D1
5 6 C R R D1
6 6 I D D D4
7 6 I S D D4
8 6 D D D D4
9 7 I R D D3
10 7 I S D D4
11 7 D D D D4
首先,当D1
存在R
时,为什么索引行0会返回SP2
?当我期望D1
时,索引行5返回D2
。
答案 0 :(得分:1)
只要你在SP2中有一个R,就会产生D1。这是因为and
的优先级高于or
。所以你的第一个if语句:
if x['STATUS'] == 'D' and x['SP1'] == 'R' or x['SP2']=='R':
相当于:
if (x['STATUS'] == 'D' and x['SP1'] == 'R') or x['SP2']=='R':
因此x['SP2']=='R'
将匹配第一个条件的任何行。
我认为你想要的是:
if x['STATUS'] == 'D' and (x['SP1'] == 'R' or x['SP2']=='R'):