【问题标题】:Replace values based on column of column names根据列名的列替换值
【发布时间】:2019-11-29 17:04:06
【问题描述】:

我有一个大型数据框(>1000 行)的测量值。其中一列是 Fails (type str),其中包含测量失败的列。测量是否失败不仅仅基于值,所以我不能只替换所有负值,这就是为什么会有一个失败列

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 失败,我需要设置 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                  

当我尝试建议的解决方案时,我得到了比我应该得到的更多的 nans

     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,其他所有内容应保持原样。

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    这是我的方法:

    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
    

    【讨论】:

    • 谢谢。我最终采取了一种稍微不同的方式,但你的评论帮助我弄清楚了我需要解决的问题
    【解决方案2】:

    我们使用 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
    

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 2022-09-30
      • 2021-08-18
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2021-06-08
      • 2021-02-20
      相关资源
      最近更新 更多