df = {'A':[3, 4, 5, np.nan, 6, 7],
'B':[np.nan, 4, np.nan, np.nan, 6, 7]}
我有一个包含两列A和B的数据框。我想创建一个新列C,这是检查A和B是否相同,是否保留然后是否保留一个的结果。是NaN,则保留其他值。列A和B始终是值或NaN。 A和B中的值始终相同。
我知道如何检查A和B是否相同:
df['C'] = (df['A'] == df['B]).astype('object')
但是,这在C列中给出了布尔值的答案,无论是正确还是错误。我的预期输出将是:
A B C
3 NaN 3
4 4 4
5 NaN 5
NaN NaN NaN
6 6 6
7 7 7
答案 0 :(得分:3)
您可以使用np.where()
>>> df = pd.DataFrame({'A':[3, 4, 5, np.nan],'B':[np.nan,4,np.nan,np.nan]})
>>> df
A B
0 3.0 NaN
1 4.0 4.0
2 5.0 NaN
3 NaN NaN
>>> df['C'] = np.where(df['A'].isna(), df['B'], df['A'])
>>> df
A B C
0 3.0 NaN 3.0
1 4.0 4.0 4.0
2 5.0 NaN 5.0
3 NaN NaN NaN
编辑的样本
表明如果df['A']
为nan并且df['B']
有值,它将起作用。
>>> df = pd.DataFrame({'A':[3, np.nan, 5, np.nan],'B':[np.nan,4,np.nan,np.nan]})
>>> df
A B
0 3.0 NaN
1 NaN 4.0
2 5.0 NaN
3 NaN NaN
>>> df['C'] = np.where(df['A'].isna(), df['B'], df['A'])
>>> df
A B C
0 3.0 NaN 3.0
1 NaN 4.0 4.0
2 5.0 NaN 5.0
3 NaN NaN NaN
谢谢:D
答案 1 :(得分:3)
使用np.select
可以检查多个条件。
df = pd.DataFrame({'A':[3, 4, 5, np.nan, 6, np.nan],
'B':[np.nan, 4, np.nan, np.nan, 6, 7]})
df['c'] = np.select([df['A'].isnull() & df['B'].isnull(), df['A'].isnull()],
[np.nan, df['B']], df['A'])
输出:
A B c
0 3.0 NaN 3.0
1 4.0 4.0 4.0
2 5.0 NaN 5.0
3 NaN NaN NaN
4 6.0 6.0 6.0
5 NaN 7.0 7.0
答案 2 :(得分:2)
如果可以保证A和B在不是nans时是相同的值,那么您可以在此处使用.combine_first
:
df['C'] = df.A.combine_first(df.B)
答案 3 :(得分:1)
我认为fillna
足以满足您的要求
df['C'] = df.A.fillna(df.B)
Out[92]:
A B C
0 3.0 NaN 3.0
1 4.0 4.0 4.0
2 5.0 NaN 5.0
3 NaN NaN NaN
4 6.0 6.0 6.0
5 7.0 7.0 7.0