在多列上使用Pandas df.where会产生意外的NaN值

尼尔斯·沃纳(Nils Werner):

给定DataFrame

import pandas as pd

df = pd.DataFrame({
    'transformed': ['left', 'right', 'left', 'right'],
    'left_f': [1, 2, 3, 4],
    'right_f': [10, 20, 30, 40],
    'left_t': [-1, -2, -3, -4],
    'right_t': [-10, -20, -30, -40],
})

我想创建两个新列,从中选择一个,left_*right_*根据其内容进行选择transformed

df['transformed_f'] = df['right_f'].where(
    df['transformed'] == 'right',
    df['left_f']
)

df['transformed_t'] = df['right_t'].where(
    df['transformed'] == 'right',
    df['left_t']
)

我得到了预期的结果

df
#    transformed  left_f  right_f  left_t  right_t  transformed_f  transformed_t
# 0  left              1       10      -1      -10              1             -1
# 1  right             2       20      -2      -20             20            -20
# 2  left              3       30      -3      -30              3             -3
# 3  right             4       40      -4      -40             40            -40

但是,当我尝试在一个操作中执行此操作时,会得到包含NaN的意外结果

df[['transformed_f', 'transformed_t']] = df[['right_f', 'right_t']].where(
    df['transformed'] == 'right',
    df[['left_f', 'left_t']]
)

df
#    transformed  left_f  right_f  left_t  right_t  transformed_f  transformed_t
# 0  left              1       10      -1      -10            NaN            NaN
# 1  right             2       20      -2      -20           20.0          -20.0
# 2  left              3       30      -3      -30            NaN            NaN
# 3  right             4       40      -4      -40           40.0          -40.0

有没有办法df.where()一次在多个列上使用

ky

您很接近,只需添加.values或将.to_numpy()其与切片一起使其成为NDarray

每个文档:

其他:cond为False的标量,NDFrame或可调用条目将替换为other中的相应值。如果other是可调用的,则它在NDFrame上计算,并应返回标量或NDFrame。可调用对象不得更改输入NDFrame(尽管pandas不会对其进行检查)。

因此,当您直接输入数据帧的切片时,索引(列名)不匹配,因此不会更新df,当您通过时.values,它将忽略索引并添加值。

df[['transformed_f', 'transformed_t']]=(df[['right_f', 'right_t']].
                        where(df['transformed'] == 'right',df[['left_f', 'left_t']].values))
print(df)

  transformed  left_f  right_f  left_t  right_t  transformed_f  transformed_t
0        left       1       10      -1      -10              1             -1
1       right       2       20      -2      -20             20            -20
2        left       3       30      -3      -30              3             -3
3       right       4       40      -4      -40             40            -40

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Pandas + Numpy:按数字dtype过滤DF列会产生意外的行为

pandas df在多列上应用条件

使用 "%" 操作会产生意外结果

在多列上使用df.withColumn()

在WHERE子句中混合使用AND和OR会产生意外结果

pandas 如何从 df2 获取 df1 的值,而 df1 和 df2 的值在列上重叠

使用goroutine进行迭代会产生意外结果

MySQL-使用LEFT JOIN会产生意外结果

尝试在别名中使用`pwd`会产生意外结果

在多列上使用df.apply的更好方法是什么?

Python Pandas - 填写 df NaN 值

使用dict的值过滤多列上的pandas数据框以实现部分字符串匹配

使用df.merge填充df中的新列会产生奇怪的匹配

在 SQL 查询中使用“true”而不是 true 会产生意外结果

使用Android Canvas.drawBitmapMesh会产生意外的位图转换

使用np.savez存储字典会产生意外结果吗?

使用TimePeriod.NET的CalendarPeriodCollector计算“工作时间”会产生意外结果

R,使用dplyr :: mutate和ifelse包含grepl()会产生意外结果

将Map与mget一起使用会产生意外的输出

使用char **指针的字符串操作代码会产生意外结果

为什么在std :: string上使用Sizeof运算符会产生意外结果?

将SVM与RBF内核一起使用会产生意外的性能

使用std :: set的.begin()和.end()函数会产生意外的结果

使用后序遍历递归进行的深度优先搜索会产生意外的输出

使用python进行二进制读取会产生意外结果

使用Repast Simphony产生意外结果

Python Pandas DF通过索引用其他DF的值替换NaN

Pandas DF 多索引选择

Pandas df.merge 意外的排序行为