鉴于以下数据框:
import pandas as pd
df = pd.DataFrame({'COL1': ['A', np.nan,'A'],
'COL2' : [np.nan,'A','A']})
df
COL1 COL2
0 A NaN
1 NaN A
2 A A
我想创建一个列('COL3'),它使用每行COL1的值,除非该值为null(或NaN)。如果值为null(或NaN),我希望它使用COL2中的值。
期望的结果是:
COL1 COL2 COL3
0 A NaN A
1 NaN A A
2 A A A
提前致谢!
答案 0 :(得分:24)
In [8]: df
Out[8]:
COL1 COL2
0 A NaN
1 NaN B
2 A B
In [9]: df["COL3"] = df["COL1"].fillna(df["COL2"])
In [10]: df
Out[10]:
COL1 COL2 COL3
0 A NaN A
1 NaN B B
2 A B A
答案 1 :(得分:3)
如果我们稍微调整你的df,那么你会发现这是有效的,并且实际上只要有一个有效值就可以用于任意数量的列:
In [5]:
df = pd.DataFrame({'COL1': ['B', np.nan,'B'],
'COL2' : [np.nan,'A','A']})
df
Out[5]:
COL1 COL2
0 B NaN
1 NaN A
2 B A
In [6]:
df.apply(lambda x: x[x.first_valid_index()], axis=1)
Out[6]:
0 B
1 A
2 B
dtype: object
first_valid_index
将返回包含第一个非NaN值的索引值(在本例中为列):
In [7]:
df.apply(lambda x: x.first_valid_index(), axis=1)
Out[7]:
0 COL1
1 COL2
2 COL1
dtype: object
因此我们可以使用它来索引系列
答案 2 :(得分:3)
您可以使用np.where
有条件地设置列值。
df = df.assign(COL3=np.where(df.COL1.isnull(), df.COL2, df.COL1))
>>> df
COL1 COL2 COL3
0 A NaN A
1 NaN A A
2 A A A
如果您不介意改变COL2中的值,可以直接更新它们以获得所需的结果。
df = pd.DataFrame({'COL1': ['A', np.nan,'A'],
'COL2' : [np.nan,'B','B']})
>>> df
COL1 COL2
0 A NaN
1 NaN B
2 A B
df.COL2.update(df.COL1)
>>> df
COL1 COL2
0 A A
1 NaN B
2 A A
答案 3 :(得分:1)
使用.combine_first
,该序列优先于调用它的Series或DataFrame中的非空值:
import pandas as pd
import numpy as np
df = pd.DataFrame({'COL1': ['A', np.nan,'A'],
'COL2' : [np.nan,'B','B']})
df['COL3'] = df.COL1.combine_first(df.COL2)
输出:
COL1 COL2 COL3
0 A NaN A
1 NaN B B
2 A B A