python - 如何使用if语句为python中的新列赋值?

标签 python pandas

我的数据框中有两列,我需要基于它们创建一个新列。例如:

df = pd.DataFrame(data={'a':[1.0,1.0,2.0], 'b':[3.0,3.0,3.0]})

df.iloc[1,0]=np.nan

 a    b
0  1.0  3.0
1  NaN  3.0
2  2.0  3.0

我需要添加一个列 c,当它不为 null 时,它从 a 中获取值,否则从 b 中获取值。喜欢:

a    b    c
0  1.0  3.0  1.0
1  NaN  3.0  3.0
2  2.0  3.0  2.0

这是我尝试过的:

def dist(df):
    if df['a']:
        return df.a
    else:
        return df.b
df['c']=df.apply(dist,axis=1)

但结果不是我所期望的。谁能建议我应该做什么?谢谢!

最佳答案

>>> d['c'] = df.a.where(~np.isnan(df.a), df.b)
>>> df
    a  b  c
0   1  3  1
1 NaN  3  3
2   2  3  2

编写更紧凑的代码很诱人:

df['c'] = df.a.where(df.a, df.b)

但这不会为 df.a[k] == 0 做正确的事情(也被解释为 False)。

您可以使用 NaN 的属性代替 isnan,因为它是唯一不等于自身的值,因此以下内容也有效:

df['c'] = df.a.where(df.a==df.a, df.b)

关于python - 如何使用if语句为python中的新列赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37313271/

相关文章:

python - Pandas Dataframe 中要行的列表列表

python - 使用不一致的格式在 Pandas DataFrame 中展平 JSON

python - 从声音文件中检测频率

python - Conda软件包需要矛盾的Numpy版本

python - App Engine channel API 不返回任何消息

python - 有没有办法以列表格式填充数据框中的缺失值作为上一行列表的最后一个值?

python - 在没有 pd.pivot 的情况下从长到宽转换 Pandas 数据框

python - 使用列表作为名称和列表中元素的字符串

python - 通过 Simple-Salesforce 批量插入时间字段

python - 如何通过构造函数实现依赖注入(inject) - Python