将我的自定义函数应用于数据框python

时间:2018-07-24 18:17:39

标签: python python-3.x pandas dataframe

我有一个带有称为Signal的列的数据框。我想向该数据框添加一个新列,并应用我构建的自定义函数。我对此很陌生,在将要从数据帧列中移出的值传递给函数时,似乎遇到了麻烦,因此,对我的语法错误或推理的任何帮助将不胜感激! / p>

@ServerName

这是我的简单功能

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

我不断收到此错误: ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

这是我尝试过的代码:

def slope_test(x):
    if x >0 and x<20:
        return 'Long'
    elif x<0 and x>-20:
        return 'Short'
    else:
        return 'Flat'

还有:

data['Position'] = data.apply(slope_test(data['Signal']))

4 个答案:

答案 0 :(得分:4)

您可以将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数组提供的矢量化功能。实际上,这是首先使用熊猫的一个很好的理由。

答案 1 :(得分:2)

尽管您的问题与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')

答案 2 :(得分:1)

您只需要对数据框系列使用.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

答案 3 :(得分:0)

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