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

Posted

技术标签:

【中文标题】如果不为空,Pandas 使用值,否则使用下一列的值【英文标题】:Pandas Use Value if Not Null, Else Use Value From Next Column 【发布时间】:2016-06-02 12:31:12 【问题描述】:

给定以下数据框:

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

提前致谢!

【问题讨论】:

我正在处理类似的问题陈述,但我想获取列名而不是列值。有人可以帮我吗?输出应该是:-COL1 COL2 COL3 0 A NaN col1 1 NaN B col2 2 A B col1 【参考方案1】:

如果我们稍微修改一下您的 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】:
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

【讨论】:

这太棒了!它可以被链接,甚至适用于带有 NaT 或 nan 的日期。需要一百万票。 这太棒了!【参考方案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

【讨论】:

我正在处理类似的问题陈述,但我想获取列名而不是列值。有人可以帮我吗?输出应该是:-COL1 COL2 COL3 0 A NaN col1 1 NaN B col2 2 A B col1 这是我得到的错误,SyntaxError: expression cannot contain assignment, perhaps you meant "=="? 【参考方案4】:

使用.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

【讨论】:

以上是关于如果不为空,Pandas 使用值,否则使用下一列的值的主要内容,如果未能解决你的问题,请参考以下文章

sql查询中有一列中有NULL的数据,如何判断不为空的时候才进行操作?

R:获取值不为空的列名

Python Pandas:获取列不为空的DataFrame的行

Pandas/Python 检查中间值和另一列的输出值

如果 NaN 用另一列替换,Pandas 将组中的最后一项替换

要检查 Pandas Dataframe 列的 TRUE/FALSE,如果 TRUE 检查另一列是不是满足条件并生成具有值 PASS/FAIL 的新列