我正在尝试基于这两个列创建一个新列。假设我想创建一个新的列z,当它没有缺失时,它应该是y的值,当y确实缺失时,它应该是x的值。所以在这个例子中,我期望z是[1, 8, 10, 8]。
[1, 8, 10, 8]
x y 0 1 NaN 1 2 8 2 4 10 3 8 NaN
vnzz0bqm1#
新列'z'使用df['z'] = df['y']从列'y'获取其值。这会带来缺失的值,因此使用fillna使用列'x'填充它们。将这两个操作链接起来:
'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
qvtsj1bj2#
您可以将apply与axis=1选项一起使用。那么你的解决方案就很简洁了。
apply
axis=1
df[z] = df.apply(lambda row: row.y if pd.notnull(row.y) else row.x, axis=1)
t30tvxxf3#
使用np.where:
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'],否则返回df['y']
df['x']
df['y']
deyfvvtc4#
假设DataFrame被称为df。首先复制y列。
df
y
df["z"] = df["y"].copy()
然后将z的nan位置设置为nan在z中的x中的位置。
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
col17t5w5#
我不确定我是否理解了这个问题,但这是你要找的吗?“if y[i]”将跳过如果值为none。
for i in range(len(x)); if y[i]: z.append(y[i]) else: z.append(x[i])
ghhaqwfi6#
update方法几乎就是这样做的。唯一需要注意的是,update将在适当的位置执行此操作,因此您必须首先创建一个副本:
update
df['z'] = df.x.copy() df.z.update(df.y)
在上面的例子中,你从x开始,用y中的相应值替换每个值,只要新值不是NaN。
x
NaN
6条答案
按热度按时间vnzz0bqm1#
新列
'z'
使用df['z'] = df['y']
从列'y'
获取其值。这会带来缺失的值,因此使用fillna
使用列'x'
填充它们。将这两个操作链接起来:qvtsj1bj2#
您可以将
apply
与axis=1
选项一起使用。那么你的解决方案就很简洁了。t30tvxxf3#
使用
np.where
:这里使用布尔条件,如果为true,则返回
df['x']
,否则返回df['y']
deyfvvtc4#
假设DataFrame被称为
df
。首先复制y
列。然后将z的nan位置设置为nan在z中的x中的位置。
col17t5w5#
我不确定我是否理解了这个问题,但这是你要找的吗?
“if y[i]”将跳过如果值为none。
ghhaqwfi6#
update
方法几乎就是这样做的。唯一需要注意的是,update
将在适当的位置执行此操作,因此您必须首先创建一个副本:在上面的例子中,你从
x
开始,用y
中的相应值替换每个值,只要新值不是NaN
。