考虑数据框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
答案 0 :(得分:3)
在mask
行loc
而不是行'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