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'即将出现?

当我使用 st.cache 时,Streamlit Unhashable TypeError

Python的可变和不可变类型