在 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
只需要一个值)。
那么,您可以做的是:
- 使用applymap():
df.loc[:, Variable_Names] = df.loc[:, Variable_Names].applymap(element)
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
我创建了一个函数如下
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
只需要一个值)。
那么,您可以做的是:
- 使用applymap():
df.loc[:, Variable_Names] = df.loc[:, Variable_Names].applymap(element)
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