【问题标题】:Use function (not using lambda) with apply method for pandas DataFrame将函数(不使用 lambda)与 pandas DataFrame 的 apply 方法一起使用
【发布时间】:2017-12-03 14:09:28
【问题描述】:

我正在尝试根据 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"

【问题讨论】:

  • 你是怎么applygetDirection()方法的?
  • getDirection 似乎是某个类中的方法,而不是常规函数。
  • @akilat90 参考这个page,我想下面的脚本正在将 getDirection() 方法应用于数据帧。 'group['direction']=group['Azimuth [deg]'].apply(self.getDirection)'
  • 这更简洁地实现为list 查找:return ["N", "NNE", "NE, "ENE", ...][int((angle*100)//1125]
  • 你如何调用 addDirection?

标签: python pandas


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    由于它的 pandas 而不是那么多 if else's 我们可以使用 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 2018-07-26
      • 2016-01-23
      • 2019-09-19
      • 2022-01-11
      相关资源
      最近更新 更多