如果不是空,Pandas使用值,否则使用下一列的值

时间:2016-02-21 00:05:43

标签: python-3.x pandas

鉴于以下数据框:

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

提前致谢!

4 个答案:

答案 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