根据列名称的列替换值

时间:2019-11-29 17:04:06

标签: python python-3.x pandas

我有一个很大的数据框(> 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,其他所有内容都应保持不变。

2 个答案:

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