在 DataFrame 中保留一些特定值并将其他值设置为零

Keep some specific values in a DataFrame and set to zero the others

我创建了一个函数如下

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')

首先看一下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)传递给您的函数,该函数不适用于数组输入(数组和数字的不等式 returns布尔数组,而 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

使用 df.select_dtypes 仅识别 df 中的 numeric 列。

然后使用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