从两列中替换值 pandas 一个条件
replace value pandas one contitions from two columns
一定有一个我没有意识到的简单解决方案。我需要考虑数据框的两列以替换其中一列中的 NaN 值。对于这个集合,我得到了正确的答案,但是在替换 q2 的缺失值之前,我需要确保 q1 为 0 且 q2 为 NaN,而不仅仅是我在此处所做的 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
需要 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
mask
or numpy.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
一定有一个我没有意识到的简单解决方案。我需要考虑数据框的两列以替换其中一列中的 NaN 值。对于这个集合,我得到了正确的答案,但是在替换 q2 的缺失值之前,我需要确保 q1 为 0 且 q2 为 NaN,而不仅仅是我在此处所做的 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
需要 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
mask
or numpy.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