熊猫有条件的创造,同时也是在逃避

时间:2018-05-16 19:44:18

标签: python python-3.x pandas numpy

我有以下数据框

col1 col2 col3
a    b    c
d    e    f
g    h    i

我写下面的

df['col1'] = np.where((df['col2'].str.contains('b',case = False,regex=True,na=False)) & 
                      (df['col3'].str.contains('c',case = False,regex=True,na=False)),'s', 'o')

我现在得到这个

col1 col2 col3
s    b    c
o    e    f
o    h    i

我现在想要执行以下操作,其中col1不等于s

df['col1'] = np.where((df['col1'] != 's') &
                      (df['col2'].str.contains('e',case = False,regex=True,na=False)) & 
                      (df['col3'].str.contains('f',case = False,regex=True,na=False)),'z','x')

我想要以下

col1 col2 col3
s    b    c
z    e    f
x    h    i

但是我得到了这个

col1 col2 col3
x    b    c
z    e    f
x    h    i

我希望逻辑不要改变col1中的s

1 个答案:

答案 0 :(得分:1)

可能还有其他有效的解决方案,您可以尝试使用以下col1等于s然后返回s,否则将np.where应用于其他条件:

df['col1'] = np.where((df['col1'] == 's'), 's', 
                      np.where((df['col2'].str.contains('e',case = False,regex=True,na=False)) & 
                               (df['col3'].str.contains('f',case = False,regex=True,na=False)),
                                'z','x')
                     ) 
print(df)

结果:

  col1 col2 col3
0    s    b    c
1    z    e    f
2    x    h    i

更新

还有where的更多条件:

df['col1'] = np.where((df['col1'] == 's'), 's', 
                      np.where((df['col1'] == 'z'), 'z',
                      np.where((df['col2'].str.contains('e',case = False,regex=True,na=False)) & 
                               (df['col3'].str.contains('f',case = False,regex=True,na=False)),
                                'z','x')
                               )
                     ) 
print(df)

使用apply:

首先我们可以创建函数,然后应用于dataframe

def function(row):
    if row['col1'] == 's':
        return 's'
    elif row['col1'] == 'z':
        return 'z'
    elif ('e' in row['col2'].lower()) and 'f' in row['col3'].lower():
        return 'z'
    else:
        return 'x'

现在,将函数应用于dataframe:

df['col1'] = df.apply(function, axis=1)
print(df)

结果:

  col1 col2 col3
0    s    b    c
1    z    e    f
2    x    h    i