将我的自定义函数应用于数据框 python
Applying my custom function to a data frame python
我有一个数据框,其中有一列名为 Signal。我想向该数据框添加一个新列并应用我构建的自定义函数。我在这方面很陌生,在将我从数据框列中获取的值传递给函数时,我似乎遇到了麻烦,因此对于我的语法错误或推理的任何帮助将不胜感激!
Signal
3.98
3.78
-6.67
-17.6
-18.05
-14.48
-12.25
-13.9
-16.89
-13.3
-13.19
-18.63
-26.36
-26.23
-22.94
-23.23
-15.7
这是我的简单函数
def slope_test(x):
if x >0 and x<20:
return 'Long'
elif x<0 and x>-20:
return 'Short'
else:
return 'Flat'
我不断收到此错误:
ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
这是我试过的代码:
data['Position'] = data.apply(slope_test(data['Signal']))
还有:
data['Position'] = data['Signal'].apply(slope_test(data['Signal']))
您只需要使用 .apply()
到您的数据框系列并传递您的自定义函数。
df.Signal.apply(slope_test)
或者,您可以使用 lambda
+ apply
(在这种情况下不推荐),如下所示:
df.Signal.apply(lambda x: slope_test(x))
输出:
0 Long
1 Long
2 Short
3 Short
4 Short
5 Short
6 Short
7 Short
8 Short
9 Short
10 Short
11 Short
12 Flat
13 Flat
14 Flat
15 Flat
16 Short
Name: Signal, dtype: object
使用 pandas.DataFrame.apply(),这对我有用:
初始化DataFrame
import pandas as pd
d = [
3.98, 3.78, -6.67, -17.6, -18.05, -14.48,
-12.25, -13.9, -16.89, -13.3, -13.19, -18.63,
-26.36, -26.23, -22.94, -23.23, -15.7]
df = pd.DataFrame(d)
定义要应用的函数
def slope_test(x):
if x >0 and x<20:
return 'Long'
elif x<0 and x>-20:
return 'Short'
else:
return 'Flat'
将函数应用于 DataFrame 的右列
df[0].apply(slope_test)
>> 0 Long
1 Long
2 Short
3 Short
4 Short
5 Short
6 Short
7 Short
8 Short
9 Short
10 Short
11 Short
12 Flat
13 Flat
14 Flat
15 Flat
16 Short
Name: 0, dtype: object
尽管您的问题是关于 apply
的,但这将在 Python 时间内 运行。您可以使用矢量化方法。这是我第一个想到的,但我认为我可以改进它:
(编辑:无需对其进行改进,我一直在寻找 np.select
,jpp 的答案中包含了它,因此我将按原样保留它以演示替代方案)
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [-5, 2, 15, -10, 22, -50]})
df['category'] = pd.cut(df['a'], [-20, 0, 20],
labels=['short', 'long']).replace(np.NaN, 'flat')
您可以使用 numpy.select
作为矢量化解决方案:
import numpy as np
conditions = [df['Signal'].between(0, 20, inclusive=False),
df['Signal'].between(-20, 0, inclusive=False)]
values = ['Long', 'Short']
df['Cat'] = np.select(conditions, values, 'Flat')
说明
您正在尝试对一个序列执行操作,就像它是一个标量一样。由于您的错误中解释的原因,这将不起作用。此外,您对 pd.Series.apply
的逻辑不正确。此方法将 function 作为输入。因此,您可以简单地使用 df['Signal'].apply(slope_test)
.
但是 pd.Series.apply
是一个美化的、低效的循环。您应该利用 Pandas 数据框下的 NumPy 数组提供的矢量化功能。事实上,这是首先使用 Pandas 的一个很好的理由。
我有一个数据框,其中有一列名为 Signal。我想向该数据框添加一个新列并应用我构建的自定义函数。我在这方面很陌生,在将我从数据框列中获取的值传递给函数时,我似乎遇到了麻烦,因此对于我的语法错误或推理的任何帮助将不胜感激!
Signal
3.98
3.78
-6.67
-17.6
-18.05
-14.48
-12.25
-13.9
-16.89
-13.3
-13.19
-18.63
-26.36
-26.23
-22.94
-23.23
-15.7
这是我的简单函数
def slope_test(x):
if x >0 and x<20:
return 'Long'
elif x<0 and x>-20:
return 'Short'
else:
return 'Flat'
我不断收到此错误: ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
这是我试过的代码:
data['Position'] = data.apply(slope_test(data['Signal']))
还有:
data['Position'] = data['Signal'].apply(slope_test(data['Signal']))
您只需要使用 .apply()
到您的数据框系列并传递您的自定义函数。
df.Signal.apply(slope_test)
或者,您可以使用 lambda
+ apply
(在这种情况下不推荐),如下所示:
df.Signal.apply(lambda x: slope_test(x))
输出:
0 Long
1 Long
2 Short
3 Short
4 Short
5 Short
6 Short
7 Short
8 Short
9 Short
10 Short
11 Short
12 Flat
13 Flat
14 Flat
15 Flat
16 Short
Name: Signal, dtype: object
使用 pandas.DataFrame.apply(),这对我有用:
初始化DataFrame
import pandas as pd
d = [
3.98, 3.78, -6.67, -17.6, -18.05, -14.48,
-12.25, -13.9, -16.89, -13.3, -13.19, -18.63,
-26.36, -26.23, -22.94, -23.23, -15.7]
df = pd.DataFrame(d)
定义要应用的函数
def slope_test(x):
if x >0 and x<20:
return 'Long'
elif x<0 and x>-20:
return 'Short'
else:
return 'Flat'
将函数应用于 DataFrame 的右列
df[0].apply(slope_test)
>> 0 Long
1 Long
2 Short
3 Short
4 Short
5 Short
6 Short
7 Short
8 Short
9 Short
10 Short
11 Short
12 Flat
13 Flat
14 Flat
15 Flat
16 Short
Name: 0, dtype: object
尽管您的问题是关于 apply
的,但这将在 Python 时间内 运行。您可以使用矢量化方法。这是我第一个想到的,但我认为我可以改进它:
(编辑:无需对其进行改进,我一直在寻找 np.select
,jpp 的答案中包含了它,因此我将按原样保留它以演示替代方案)
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [-5, 2, 15, -10, 22, -50]})
df['category'] = pd.cut(df['a'], [-20, 0, 20],
labels=['short', 'long']).replace(np.NaN, 'flat')
您可以使用 numpy.select
作为矢量化解决方案:
import numpy as np
conditions = [df['Signal'].between(0, 20, inclusive=False),
df['Signal'].between(-20, 0, inclusive=False)]
values = ['Long', 'Short']
df['Cat'] = np.select(conditions, values, 'Flat')
说明
您正在尝试对一个序列执行操作,就像它是一个标量一样。由于您的错误中解释的原因,这将不起作用。此外,您对 pd.Series.apply
的逻辑不正确。此方法将 function 作为输入。因此,您可以简单地使用 df['Signal'].apply(slope_test)
.
但是 pd.Series.apply
是一个美化的、低效的循环。您应该利用 Pandas 数据框下的 NumPy 数组提供的矢量化功能。事实上,这是首先使用 Pandas 的一个很好的理由。