我有一个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没有状态为D的R,但如果状态==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
首先,当SP2
有一个R
时,为什么索引行0返回一个D1
?索引行5返回D1
,而我期望的是D2
。你知道吗
任何时候你在SP2中有一个R,结果都是D1。这是因为
and
的优先级高于or
。所以你的第一句话:相当于:
所以
x['SP2']=='R'
将匹配第一个条件的任何行。你知道吗我想你想要的是:
相关问题 更多 >
编程相关推荐