Unhashable 类型:'dict' 同时使用 pandas 的函数?
Posted
技术标签:
【中文标题】Unhashable 类型:\'dict\' 同时使用 pandas 的函数?【英文标题】:Unhashable type: 'dict' while applying a function with pandas?Unhashable 类型:'dict' 同时使用 pandas 的函数? 【发布时间】:2017-05-16 23:54:59 【问题描述】:我正在使用 requests 库将 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 在 应用(自我,函数,convert_dtype,args,**kwds)2287 2288 如果 is_extension_type(self.dtype): -> 2289 映射 = self._values.map(f) 2290 其他:2291 值 = self.asobject
/usr/local/lib/python3.5/site-packages/pandas/core/categorical.py 地图(自我,映射器) 第950章 951 类别=新类别, --> 952 有序=self.ordered) 953 除了值错误: 第954章
/usr/local/lib/python3.5/site-packages/pandas/core/categorical.py from_codes(cls,代码,类别,有序,名称) 466“代码需要转换为整数数组”) 467 --> 468 个类别 = cls._validate_categories(categories) 469 470 if len(codes) and (codes.max() >= len(categories) or codes.min()
/usr/local/lib/python3.5/site-packages/pandas/core/categorical.py _validate_categories(cls,类别,快速路径) 571 # 类别必须是唯一的 572 --> 573 如果不是 categories.is_unique: 574 raise ValueError('分类类别必须是唯一的') 第575章
pandas/src/properties.pyx 在 pandas.lib.cache_readonly.get (pandas/lib.c:43685)()
/usr/local/lib/python3.5/site-packages/pandas/indexes/base.py is_unique(self) 1068 def is_unique(self): 1069 """ 如果索引具有唯一值则返回 """ -> 1070 返回 self._engine.is_unique 1071 1072 @property
pandas/index.pyx 在 pandas.index.IndexEngine.is_unique.get (pandas/index.c:4883)()
pandas/index.pyx 在 pandas.index.IndexEngine.initialize (pandas/index.c:5828)()
pandas/src/hashtable_class_helper.pxi 在 pandas.hashtable.PyObjectHashTable.map_locations (pandas/hashtable.c:13788)()
TypeError: unhashable type: 'dict'
因此,我的问题是如何将foo
函数正确应用于df
列?
【问题讨论】:
你的函数foo()
的定义没有帮助。我用return json.loads("[1,2,3,\"a\":123]")
替换了它的主体——错误无法重现。
你可以试试这个:df[['colA']].apply(foo, axis=1)
感谢@MaxU 的帮助,您的解决方案有效,为什么会这样?
【参考方案1】:
调用df['colA'].apply(foo)
类似于:foo(df['colA'])
(其中df['colA']
- 是pandas.Series
),因此您的函数应该能够接受pandas.Series 作为参数 - 如果不是这种情况和@987654326 @ 只能接受标量参数,那么我们必须为每一行调用 foo()
:
df[['colA']].apply(foo, axis=1)
注意:df[['colA']]
- 是一个 DataFrame,因为 Series.apply() 函数没有 axis
参数
【讨论】:
感谢您的解释...如何修改我的函数以接收 pandas 列作为参数? @tumbleweed,不客气!您当前的实现已经收到整个列(系列)。所以它取决于http://api.example.com/foo
- 它是否能够处理/接受值列表(系列)?
该api默认可以接受一个字符串(nko
参数),我应该如何正确地将数据框传递给nko
参数?。
@tumbleweed,如果nko
必须是一个字符串,那么您很可能无法通过整个列。或者,您可以尝试在foo()
函数中实现一个循环,并在多个进程中为所有行(列中的所有值)调用http://api.example.com/foo
,以加快速度。以上是关于Unhashable 类型:'dict' 同时使用 pandas 的函数?的主要内容,如果未能解决你的问题,请参考以下文章
Python debug——TypeError unhashable type(list/set/dict)
2. python提示:TypeError: unhashable type: 'list'
Unhashable 类型:尝试在 Django 中使用 post_save 动态添加 m2m 关系时出现“列表”错误
为什么TypeError:unhashable类型:'list'即将出现?