从两列替换值pandas一个contitions

时间:2017-06-27 12:22:30

标签: python pandas dataframe indexing conditional

必须有一个我没有意识到的简单解决方案。我需要考虑数据帧的两列来替换其中一列中的NaN值。对于这个集合,我得到正确的答案,但我需要确保q1都是0,q2是NaN,然后​​我替换q2的缺失值,不仅q1是0,我在这里做了:

import pandas as pd
import numpy as np 
df = pd.DataFrame({'ID':[1,2,3,4,5,6], 'q1':[0,0,1,1,0,1], 'q2': [np.nan, np.nan, np.nan, 29, np.nan, 18]})
print df
  ID  q1  q2
0   1   0 NaN
1   2   0 NaN
2   3   1 NaN
3   4   1  29
4   5   0 NaN
5   6   1  18

df.loc[df.q1 ==0, 'q2']= 999
print df

ID  q1   q2
0   1   0  999
1   2   0  999
2   3   1  NaN
3   4   1   29
4   5   0  999
5   6   1   18

我试过这个,但它不考虑q2

df.loc[(df['q1'] == 0) & (df['q2']==np.nan), 'q2'] = 999

1 个答案:

答案 0 :(得分:1)

需要isnull来检查NaN s:

df.loc[(df['q1'] == 0) & (df['q2'].isnull()), 'q2'] = 999
print (df)
   ID  q1     q2
0   1   0  999.0
1   2   0  999.0
2   3   1    NaN
3   4   1   29.0
4   5   0  999.0
5   6   1   18.0

为了更好地测试,一些值发生了变化:

 df = pd.DataFrame({'ID':[1,2,3,4,5,6], 
                  'q1':[0,0,1,1,0,1], 
                  'q2': [np.nan, 1.0, np.nan, 29, np.nan, 18]})

print (df)
   ID  q1    q2
0   1   0   NaN
1   2   0   1.0
2   3   1   NaN
3   4   1  29.0
4   5   0   NaN
5   6   1  18.0

df.loc[(df['q1'] == 0) & (df['q2'].isnull()), 'q2'] = 999
print (df)

   ID  q1     q2
0   1   0  999.0
1   2   0    1.0
2   3   1    NaN
3   4   1   29.0
4   5   0  999.0
5   6   1   18.0

masknumpy.where的替代解决方案:

df['q2'] = df['q2'].mask((df['q1'] == 0) & (df['q2'].isnull()), 999)
print (df)
   ID  q1     q2
0   1   0  999.0
1   2   0    1.0
2   3   1    NaN
3   4   1   29.0
4   5   0  999.0
5   6   1   18.0
df['q2'] = np.where((df['q1'] == 0) & (df['q2'].isnull()), 999,df['q2'])
print (df)
   ID  q1     q2
0   1   0  999.0
1   2   0    1.0
2   3   1    NaN
3   4   1   29.0
4   5   0  999.0
5   6   1   18.0