簡體   English   中英

將函數(不使用lambda)與pandas DataFrame的apply方法一起使用

[英]Use function (not using lambda) with apply method for pandas DataFrame

我試圖根據此下面數據框中的現有列添加列。
由於有很多if情況,因此我將if情況定義為函數(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"

調用self.getDirection(a) ,將隱式調用getDirection(self, a) 這就是錯誤消息指出給出兩個參數而不是一個參數的原因( self和系列元素)。

調用函數(以self.開頭)的方式意味着它不是靜態方法 ,而是實例方法 實例方法在類內部定義; 它們的結果通常取決於您調用它的對象的內部狀態(類的實例)。

如果錯誤地將該函數作為實例方法調用則應編寫apply(getDirection)而不是apply(self.getDirection) 這很可能就是您想要的,因為函數的結果僅取決於angle ,而不取決於任何對象的內部狀態。

如果希望getDirection成為實例方法請將函數定義為def getDirection(self, a) 您無需更改其他任何內容。

另請參見有關實例和類方法的此答案

正如@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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM