Python:从现有列创建新列

Python:从现有列创建新列,python,pandas,missing-data,calculated-columns,Python,Pandas,Missing Data,Calculated Columns,我正在尝试基于这两列创建一个新列。假设我想创建一个新的列z,当它没有丢失时,它应该是y的值,当y确实丢失时,它应该是x的值。所以在本例中,我希望z是[1,8,10,8] x y 0 1 NaN 1 2 8 2 4 10 3 8 NaN 我不确定我是否理解这个问题,但这就是你想要的吗 如果值为none,“if y[i]”将跳过 for i in range(len(x)); if y[i]: z.append(y[i]) else:

我正在尝试基于这两列创建一个新列。假设我想创建一个新的列z,当它没有丢失时,它应该是y的值,当y确实丢失时,它应该是x的值。所以在本例中,我希望z是
[1,8,10,8]

   x   y
0  1 NaN
1  2   8
2  4  10
3  8 NaN

我不确定我是否理解这个问题,但这就是你想要的吗

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

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

假设数据帧被称为
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

使用
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']
,您可以使用
apply
选项
axis=1
。那么你的解决方案就相当简洁了

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

update
方法几乎就是这样做的。唯一需要注意的是,
update
将在适当的位置执行此操作,因此您必须首先创建副本:

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

在上面的示例中,您从
x
开始,用
y
中的相应值替换每个值,只要新值不是
NaN
新列
'z'
使用
df['z']=df['y']
从列
'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

它不起作用。由于某种原因,它从来没有碰到过else条款。谢谢!真的很有帮助~不用担心,如果你发现这个或另一个答案完全回答了你的问题,那么请接受答案,答案左上角会有一个空勾号,这样答案就不会一直没有答案了很好,很有帮助很酷!我不知道从这一个问题中学到了多少!路途~~