为什么在使用loc分配时会得到nan

时间:2016-12-29 21:15:08

标签: python pandas

考虑数据框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'中的值等于零mod 3

我创建了布尔掩码

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  

我应该如何获得这个结果?

    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 个答案:

答案 0 :(得分:3)

maskloc而不是行'A'中加入'E'

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

您看到NaN值的原因是您将所有行'A'重新分配为行'E'的屏蔽版本。行'E'的屏蔽版本缺少某些列的条目,因此它们会被NaN填充。 NaN的dtype是float,它强制所有其他整数值为浮点数。通过在行mask上使用'A',您只需要分配到要更新的位置。

结果输出:

    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

答案 1 :(得分: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