为什么使用loc赋值时会得到nan?

3
考虑数据框 df
df = pd.DataFrame(np.arange(25).reshape(5, 5), list('ABCDE'), list('abcde'))
print(df)

    a   b   c   d   e
A   0   1   2   3   4
B   5   6   7   8   9
C  10  11  12  13  14
D  15  16  17  18  19
E  20  21  22  23  24

我想要将行'A'中的值替换为行'E'中对应的值,只有当行'D'中的值等于零模三时

我创建了布尔掩码

mask = df.loc['D'] % 3 == 0

然后我开始做我的作业

df.loc['A'] = df.loc['E', mask]

然而,我现在在一些列中有 np.nan ,导致整个数据框架变成了 float 类型。

print(df)

      a     b     c     d     e
A  20.0   NaN   NaN  23.0   NaN
B   5.0   6.0   7.0   8.0   9.0
C  10.0  11.0  12.0  13.0  14.0
D  15.0  16.0  17.0  18.0  19.0
E  20.0  21.0  22.0  23.0  24.0  

我该如何获得这个结果?(关于IT技术方面的问题)
    a   b   c   d   e
A  20   1   2  23   4
B   5   6   7   8   9
C  10  11  12  13  14
D  15  16  17  18  19
E  20  21  22  23  24
2个回答

3

在您的loc中,将行'E'替换为行'A',并包括mask

df.loc['A', mask] =  df.loc['E']

你看到 NaN 值的原因是,你正在将行 'A' 的所有值重新赋值为行 'E' 的掩码版本。行 'E' 的掩码版本缺少某些列的条目,因此这些位置被填充为 NaNNaN 的数据类型为 float,这迫使所有其他整数值成为浮点数。通过在行 'A' 上使用 mask,您只会对要更新的位置进行赋值。
结果输出如下:
    a   b   c   d   e
A  20   1   2  23   4
B   5   6   7   8   9
C  10  11  12  13  14
D  15  16  17  18  19
E  20  21  22  23  24

2

试试这个:

In [172]: df.loc['A', df.columns[df.loc['D'] % 3 == 0]] = df.loc['E']

In [173]: df
Out[173]:
    a   b   c   d   e
A  20   1   2  23   4
B   5   6   7   8   9
C  10  11  12  13  14
D  15  16  17  18  19
E  20  21  22  23  24

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接