[英]how to use pandas 'apply' method to apply function on specific subset of dataframe?
[英]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.