我正在尝试根据此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"
答案 0 :(得分:2)
致电self.getDirection(a)
时,您隐式调用getDirection(self, a)
。这就是为什么错误消息表明给出了两个参数而不是一个(self
和系列元素)。
调用函数的方式(前置self.
)意味着它不是静态方法,而是实例方法。实例方法在类中定义;它们的结果通常取决于您调用它的对象(类的实例)的内部状态。
如果错误地将该函数称为实例方法,则应编写apply(getDirection)
而不是apply(self.getDirection)
。这很可能是你想要的,因为函数的结果只取决于angle
,而不取决于任何对象的内部状态。
如果希望getDirection
成为实例方法,将该函数定义为def getDirection(self, a)
。你不必改变其他任何东西。
答案 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