我有一个很大的数据框(> 1000行)。列之一是“失败”(类型为str),其中包含测量失败的列。度量是否失败并不仅仅基于值,因此例如,我不能仅替换所有负值,这就是为什么出现Fails列
的原因Cd Sn Sb Zn Fails
-1 -2 0.0 4 Cd Sn Sb
-2 0.0 -1 5 Cd Sn Sb
-3 -3 -2 6 Cd Sn Sb
1 2 3 4 Zn
如果元素失败,则需要用nan代替度量。因此,对于df中的每一行,如果col在Fails中,我需要设置df.loc [row,col] = nan。
Cd Sn Sb Zn Fails
nan nan nan 4 Cd Sn Sb
nan nan nan 5 Cd Sn Sb
nan nan nan 6 Cd Sn Sb
1 2 3 nan Zn
什么是有效的方法?
编辑:
我尝试使用上面的一个简单示例。 df中还有更多列。实际上有29个不同的元素。这就是感兴趣的部分的样子
data.iloc[:,5:34]
Out[45]:
Se As Ga Ni ... Tl Pb U Ir
0 19.026755 3.290577 0.0 0.0 ... 0.619604 4.674604 0.030976 0.0
1 35.682812 55.108543 0.0 0.0 ... 4.217798 25.213694 0.216073 0.0
2 93.600473 187.171588 0.0 0.0 ... 12.480773 74.187307 0.647617 0.0
3 229.575678 560.092296 0.0 0.0 ... 37.041994 261.348135 1.926765 0.0
4 56.337625 14.344270 0.0 0.0 ... 0.375804 0.926559 0.004466 0.0
.. ... ... ... ... ... ... ... ... ...
871 NaN NaN NaN NaN ... NaN NaN NaN NaN
data["Fails"]
Out[50]:
0 Cd Sn Sb Cu Zn
1 Cd Sn Sb Cu Zn
2 Cd Sn Sb Cu Zn
3 Cd Sn Sb Cu Zn
4 Cd Sn Sb Cu Zn
871
当我尝试解决方案时,我得到的营养不良超过了我应该得到的
Se As Ga Ni Mn ... Tl Pb U Ir
0 NaN NaN NaN NaN 0.715142 ... NaN NaN 0.030976 NaN
1 NaN NaN NaN NaN 2.295966 ... NaN NaN 0.216073 NaN
2 NaN NaN NaN NaN 6.654716 ... NaN NaN 0.647617 NaN
3 NaN NaN NaN NaN 20.567433 ... NaN NaN 1.926765 NaN
4 NaN NaN NaN NaN 0.285542 ... NaN NaN 0.004466 NaN
.. .. .. .. .. ... ... .. .. ... ..
871 NaN NaN NaN NaN NaN ... NaN NaN NaN NaN
在前几行中,仅Cd,Sn,Sb,Cu和Zn应该设置为nan,其他所有内容都应保持不变。
答案 0 :(得分:0)
这是我的方法:
rep_cols = ['Cd','Sn','Sb','Cu','Zn']
s = df.Fails.str.split(expand=True).stack().reset_index(name='col')
df.loc[:, rep_cols] = df.mask(s.pivot('level_0', 'col', 'level_1').notnull())
输出:
Cd Sn Sb Zn Fails
0 NaN NaN NaN 4.0 Cd Sn Sb
1 NaN NaN NaN 5.0 Cd Sn Sb
2 NaN NaN NaN 6.0 Cd Sn Sb
3 1.0 2.0 3.0 NaN Zn
答案 1 :(得分:0)
IIUC我们使用get_dummies
df=df.mask(df.Fails.str.get_dummies(' ').astype(bool)).assign(Fails=df.Fails)
df
Cd Sn Sb Zn Fails
0 NaN NaN NaN 4.0 Cd Sn Sb
1 NaN NaN NaN 5.0 Cd Sn Sb
2 NaN NaN NaN 6.0 Cd Sn Sb
3 1.0 2.0 3.0 NaN Zn