【问题标题】:Keep some specific values in a DataFrame and set to zero the others在 DataFrame 中保留一些特定值并将其他值设置为零
【发布时间】:2021-03-03 23:07:55
【问题描述】:

我创建了如下函数

def element(x):
    return x*1 if x > 0.09 else x*0

我有一个如下的数据框:

    index   FACTOR1     FACTOR2     FACTOR3
0   ECON1   0.0955037   0.0297977   0.0148448
1   ECON2   0.00505775  0.142272    0.0516773
2   ECON2   0.0360157   0.0115226   0.133393
3   FOOD1   0.106315    0.000673806 0.0264848
4   FOOD2   0.0188154   0.0344419   0.138877
5   FOOD3   0.00941108  0.1851     0.000474615

我想保持大于阈值的值(比如 0.09 - 参见上面的函数)并将其他值设置为零。

我应用了以下功能,但它不起作用

display(df.apply(element, subset=Variable_Names) )

我得到了错误

TypeError: ("element() got an unexpected keyword argument 'subset'", 'occurred at index FACTOR1')

【问题讨论】:

    标签: python python-3.x function dataframe apply


    【解决方案1】:

    使用df.select_dtypes 仅识别来自dfnumeric 列。

    然后使用numpy.where检查大于阈值的值并将其余的分配给0

    In [2897]: import numpy as np
    
    In [2915]: threshold = 0.09
    
    In [2898]: cols = df.select_dtypes('number').columns
    
    In [2911]: df[cols] = np.where(df[cols].gt(threshold), df[cols], 0)
    
    In [2912]: df
    Out[2912]: 
       index   FACTOR1   FACTOR2   FACTOR3
    0  ECON1  0.095504  0.000000  0.000000
    1  ECON2  0.000000  0.142272  0.000000
    2  ECON2  0.000000  0.000000  0.133393
    3  FOOD1  0.106315  0.000000  0.000000
    4  FOOD2  0.000000  0.000000  0.138877
    5  FOOD3  0.000000  0.185100  0.000000
    

    【讨论】:

      【解决方案2】:

      首先看apply方法的文档。如果你像这样调用df.apply(element, subset=Variable_Names),你需要为函数element提供一个额外的参数subset(这不是该函数所期望的)。

      其次,您应该只选择数据框的数字部分来应用您的函数:

      df.loc[:, Variable_Names]
      

      第三,如果你像这样将这个函数应用到你的DataFrame,你会得到

      ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index FACTOR1')
      

      因为 apply 将列(默认情况下)或行(带有选项 axis=1)传递给您的函数,它不适用于数组输入(数组和数字的不等式返回布尔数组,而 if只需要一个值)。

      那么,你可以做的是:

      1. 使用applymap():
      df.loc[:, Variable_Names] = df.loc[:, Variable_Names].applymap(element)
      
      1. 使用np.vectorize():
      df.loc[:, Variable_Names] = df.loc[:, Variable_Names].apply(np.vectorize(element))
      

      都给出期望的输出:

          index   FACTOR1     FACTOR2     FACTOR3
      0   ECON1   0.095504    0.000000    0.000000
      1   ECON2   0.000000    0.142272    0.000000
      2   ECON2   0.000000    0.000000    0.133393
      3   FOOD1   0.106315    0.000000    0.000000
      4   FOOD2   0.000000    0.000000    0.138877
      5   FOOD3   0.000000    0.185100    0.000000
      

      【讨论】:

        猜你喜欢
        • 2021-12-20
        • 1970-01-01
        • 2023-01-24
        • 2021-02-09
        • 2020-06-29
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多