使用函数(不使用lambda)和pandas DataFrame的apply方法

时间:2017-12-03 14:09:28

标签: python pandas

我正在尝试根据此page之后的数据框中的现有列添加列 由于有很多if case,我将if case定义为函数(getDirection方法)并尝试通过apply方法调用(addDirection方法)。
然后,我得到了以下错误。

TypeError: getDirection() takes 1 positional argument but 2 were given  

有人可以通过申请数据框告诉我如何调用函数吗? 代码如下所示。

def addDirection(self):
    group=self.group
    group['direction']=group['Azimuth [deg]'].apply(self.getDirection)

   def getDirection(angle):
        if angle < 11.25 or angle >= 348.75:
            return "N"
        elif angle < 33.75 and angle >= 11.25:
            return "NNE"
        elif angle < 56.25 and angle >= 33.75:
            return "NE"
        elif angle < 78.75 and angle >= 56.25:
            return "ENE"
        elif angle < 101.25 and angle >= 78.75:
            return "E"
        elif angle < 123.75 and angle >= 101.25:
            return "ESE"
        elif angle < 146.25 and angle >= 123.75:
            return "SE"
        elif angle < 168.75 and angle >= 146.25:
            return "SSE"
        elif angle < 191.25 and angle >= 168.75:
            return "S"
        elif angle < 213.75 and angle >= 191.25:
            return "SSW"
        elif angle < 236.25 and angle >= 213.75:
            return "SW"
        elif angle < 258.75 and angle >= 236.25:
            return "WSW"
        elif angle < 281.25 and angle >= 258.75:
            return "W"
        elif angle < 303.75 and angle >= 281.25:
            return "WNW"
        elif angle < 326.25 and angle >= 303.75:
            return "NW"
        elif angle < 348.75 and angle >= 326.25:
            return "NNW"

2 个答案:

答案 0 :(得分:2)

致电self.getDirection(a)时,您隐式调用getDirection(self, a) 。这就是为什么错误消息表明给出了两个参数而不是一个(self和系列元素)。

调用函数的方式(前置self.)意味着它不是静态方法,而是实例方法。实例方法在类中定义;它们的结果通常取决于您调用它的对象(类的实例)的内部状态。

如果错误地将该函数称为实例方法则应编写apply(getDirection) 而不是apply(self.getDirection)。这很可能是你想要的,因为函数的结果只取决于angle,而不取决于任何对象的内部状态。

如果希望getDirection成为实例方法将该函数定义为def getDirection(self, a) 。你不必改变其他任何东西。

另见this answer on instance and class methods

答案 1 :(得分:2)

正如@Cornflex所说,是因为你使用self传递了额外的参数,所以你得到了这个错误。要么def getDirection(self,angle),要么apply.(getDirection)

由于它的熊猫而不是那么多,如果我们可以使用pd.cut进行分类,即

df = pd.DataFrame({'Azimuth [deg]':[300,340,150]})
bins = [11.25, 33.75, 56.25, 78.75, 101.25, 123.75, 146.25, 168.75, 191.25, 213.75, 236.25, 258.75, 281.75, 303.75, 326.25, 348.75]

labels = ['NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW']

pd.cut(df['Azimuth [deg]'],bins=bins,labels=labels).fillna('N') # fillna is for your first condition.

0    WNW
1    NNW
2    SSE
Name: Azimuth [deg], dtype: category
Categories (15, object): [NNE < NE < ENE < E ... W < WNW < NW < NNW]
In [557]:

df['Azimuth [deg]'].apply(getDirection)

0    WNW
1    NNW
2    SSE
Name: Azimuth [deg], dtype: object