有条件的和与或语句结合的

2024-04-20 11:19:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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。你知道吗


Tags: orand代码iddfreturnstatuslevel
1条回答
网友
1楼 · 发布于 2024-04-20 11:19:21

任何时候你在SP2中有一个R,结果都是D1。这是因为and的优先级高于or。所以你的第一句话:

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'):

相关问题 更多 >