Python:从现有列创建一个新列

时间:2015-05-15 17:45:37

标签: 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

6 个答案:

答案 0 :(得分:15)

新列'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

答案 1 :(得分:13)

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

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

答案 2 :(得分:4)

使用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']

答案 3 :(得分:1)

我们假设DataFrame被称为df。首先复制y列。

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

然后将z的nan位置设置为x中n为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

答案 4 :(得分:0)

我不确定我是否理解这个问题,但这会是你正在寻找的吗?

"如果y [i]"如果值为none,则跳过。

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

答案 5 :(得分:0)

update方法几乎就是这样做的。唯一需要注意的是update将会这样做,所以你必须先创建一个副本:

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

在上面的示例中,您从x开始,并使用y中的相应值替换每个值,只要新值不是NaN