如果不为空,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的数据,如何判断不为空的时候才进行操作?
Python Pandas:获取列不为空的DataFrame的行
如果 NaN 用另一列替换,Pandas 将组中的最后一项替换
要检查 Pandas Dataframe 列的 TRUE/FALSE,如果 TRUE 检查另一列是不是满足条件并生成具有值 PASS/FAIL 的新列