从存在缺失值的现有列创建新列

问题描述 投票:0回答:6

我正在尝试根据这两列创建一个新列。假设我想创建一个新列 z,当 y 不丢失时,它应该是 y 的值;当 y 确实丢失时,它应该是 x 的值。所以在这种情况下,我期望 z 为

[1, 8, 10, 8]

   x   y
0  1 NaN
1  2   8
2  4  10
3  8 NaN
python pandas missing-data
6个回答
20
投票

您可以将

apply
与选项
axis=1
一起使用。那么你的解决方案非常简洁。

df[z] = df.apply(lambda row: row.y if pd.notnull(row.y) else row.x, axis=1)

19
投票

新列

'z'
使用
'y'
从列
df['z'] = df['y']
获取其值。这会带来缺失值,因此请使用
fillna
使用列
'x'
来填充它们。链接这两个动作:

>>> df['z'] = df['y'].fillna(df['x'])
>>> df
   x   y   z
0  1 NaN   1
1  2   8   8
2  4  10  10
3  8 NaN   8

7
投票

使用

np.where

In [3]:

df['z'] = np.where(df['y'].isnull(), df['x'], df['y'])
df
Out[3]:
   x   y   z
0  1 NaN   1
1  2   8   8
2  4  10  10
3  8 NaN   8

这里使用布尔条件,如果 true 返回

df['x']
else
df['y']


2
投票

假设 DataFrame 称为

df
。首先复制
y
列。

df["z"] = df["y"].copy()

然后将 z 的 nan 位置设置为 x 中 nan 位于 z 中的位置。

import numpy as np
df.z[np.isnan(df.z)]=df.x[np.isnan(df.z)]


>>> df 
   x   y   z
0  1 NaN   1
1  2   8   8
2  4  10  10
3  8 NaN   8

0
投票

我不确定我是否理解这个问题,但这就是您要找的吗?

如果值为 None,“if y[i]” 将跳过。

for i in range(len(x));
    if y[i]:
        z.append(y[i])
    else:
        z.append(x[i])

0
投票

update
方法几乎正是这样做的。唯一需要注意的是
update
会就地执行此操作,因此您必须首先创建一个副本:

df['z'] = df.x.copy()
df.z.update(df.y)

在上面的示例中,您从

x
开始,并将每个值替换为
y
中的相应值,只要新值不是
NaN

© www.soinside.com 2019 - 2024. All rights reserved.