Python:从现有列创建新列
Posted
技术标签:
【中文标题】Python:从现有列创建新列【英文标题】:Python: create a new column from existing columns 【发布时间】:2015-07-27 17:53:15 【问题描述】:我正在尝试基于两列创建一个新列。假设我想创建一个新列 z,当它没有丢失时它应该是 y 的值,当 y 确实丢失时它应该是 x 的值。所以在这种情况下,我希望 z 是[1, 8, 10, 8]
。
x y
0 1 NaN
1 2 8
2 4 10
3 8 NaN
【问题讨论】:
【参考方案1】:我不确定我是否理解这个问题,但这会是您要找的吗?
"if y[i]" 如果值为 none,将跳过。
for i in range(len(x));
if y[i]:
z.append(y[i])
else:
z.append(x[i])
【讨论】:
它不起作用。出于某种原因,它永远不会遇到 else 子句。【参考方案2】:假设 DataFrame 被称为df
。先复制y
列。
df["z"] = df["y"].copy()
然后将z的nan位置设置为x中nans在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
【讨论】:
【参考方案3】:使用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
这里它使用布尔条件,如果为真则返回df['x']
,否则返回df['y']
【讨论】:
谢谢!很有帮助~ 不用担心,如果您发现这个或另一个答案完全回答了您的问题,那么请接受一个答案,答案的左上角会有一个空的勾号,这样答案就不会保留未答复 很好,很有帮助【参考方案4】:您可以将apply
与选项axis=1
一起使用。那么你的解决方案就非常简洁了。
df[z] = df.apply(lambda row: row.y if pd.notnull(row.y) else row.x, axis=1)
【讨论】:
【参考方案5】:update
方法几乎就是这样做的。唯一需要注意的是 update
会在原地执行此操作,因此您必须先创建一个副本:
df['z'] = df.x.copy()
df.z.update(df.y)
在上面的示例中,您从x
开始,并将每个值替换为来自y
的对应值,只要新值不是NaN
。
【讨论】:
【参考方案6】:新列 '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
【讨论】:
太酷了!不知道从这一个问题中学到了很多东西!一路走好~~以上是关于Python:从现有列创建新列的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 Jupyter Notebook 上使用 Pandas 从现有列创建新列时出现 NoneType 错误
Pyspark - 从 DataFrame 列的操作创建新列给出错误“列不可迭代”