我正在使用请求库将api包裹成一个函数:
import pandas as pd
import requests, json
def foo(text):
payload = {'key': '00ac1ef82687c7533d54be2e9', 'of': 'json', \
'nko': text, \
'woei': 'm', \
'nvn': 'es'}
r = requests.get('http://api.example.com/foo', params=payload)
data = json.loads(r.text)
return data
然后,我想将上述函数应用于以下数据帧:
DF:
colA
0 lore lipsum dolor done
1 lore lipsum
2 done lore
3 dolor lone lipsum
因此,我尝试了以下内容:
df['new_col'] = df['colA'].apply(foo)
df
但是,我得到以下例外:
/usr/local/lib/python3.5/site-packages/pandas/core/series.py in apply(self,func,convert_dtype,args,** kwds)2287 2288
if is_extension_type(self.dtype): - > 2289 mapped = self._values.map(f)2290 else:2291 values = self.asobject/usr/local/lib/python3.5/site-packages/pandas/core/categorical.py in 地图(自我,映射器) 950返回self.from_codes(self._codes.copy(), 951类= new_categories, - > 952 ordered = self.ordered) 953除了ValueError: 954 return np.take(new_categories,self._codes)
/usr/local/lib/python3.5/site-packages/pandas/core/categorical.py in from_codes(cls,代码,类别,有序,名称) 466"代码需要可以转换为整数数组") 467 - > 468个类别= cls._validate_categories(类别) 469 470如果len(代码)和(codes.max()> = len(类别)或codes.min()< -1):
/usr/local/lib/python3.5/site-packages/pandas/core/categorical.py in _validate_categories(cls,categories,fastpath) 571个#类别必须是唯一的 572 - > 573如果不是categories.is_unique: 574引发ValueError('分类类别必须是唯一的') 575
pandas.lib.cache_readonly中的pandas / src / properties.pyx。获取 (熊猫/ lib.c:43685)()/usr/local/lib/python3.5/site-packages/pandas/indexes/base.py in is_unique(self)1068 def is_unique(self):1069""" 如果索引具有唯一值,则返回""" - > 1070返回self._engine.is_unique 1071 1072 @property
pandas.index.IndexEngine.is_unique中的pandas / index.pyx。获取 (熊猫/ index.c:4883)()
pandas.index.IndexEngine.initialize中的pandas / index.pyx (熊猫/ index.c:5828)()
pandas / src / hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.map_locations (熊猫/ hashtable.c:13788)()
TypeError:不可用类型:' dict'
因此,我的问题是如何正确地将foo
函数应用于df
列?
答案 0 :(得分:1)
调用df['colA'].apply(foo)
类似于:foo(df['colA'])
(其中df['colA']
- 是pandas.Series
),因此您的函数应该能够接受pandas.Series作为参数 - 如果不是这种情况且foo()
只能接受标量参数,那么我们必须为每一行调用foo()
:
df[['colA']].apply(foo, axis=1)
注意:df[['colA']]
- 是一个DataFrame,因为Series.apply()函数没有axis
参数