有条件的并与陈述结合

时间:2015-07-06 20:23:58

标签: python csv pandas

我有一个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

1 个答案:

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