首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python :丢弃重复函数-不寻常的行为

Python :丢弃重复函数-不寻常的行为
EN

Stack Overflow用户
提问于 2022-01-15 05:56:40
回答 2查看 436关注 0票数 0

错误-> TypeError: unhashable type:'list‘保存数据帧并再次加载后消失.

保存和加载、生成的数据帧都具有相同的dtype.

可复制->

代码语言:javascript
运行
复制
--> import pandas as pd
--> l1 = [[1], [1], [1], [1], [1], [1], [1], [1], [6], [1], [6], [1], [6], [6], [6], [6], [6], [6], [6], [6], [6]]

## len(l1) is 21 ##

--> l2 = ['a']*21
--> l3 = ['c']*10 + ['d']*10 + ['e']
--> df = pd.DataFrame()
--> df['col1'], df['col2'], df['col3'] = l1, l3, l2
--> df
        col1 col2 col3
        0   [1]    c    a
        1   [1]    c    a
        2   [1]    c    a
        3   [1]    c    a
        4   [1]    c    a
        5   [1]    c    a
        6   [1]    c    a
        7   [1]    c    a
        8   [6]    c    a
        9   [1]    c    a
        10  [6]    d    a
        11  [1]    d    a
        12  [6]    d    a
        13  [6]    d    a
        14  [6]    d    a
        15  [6]    d    a
        16  [6]    d    a
        17  [6]    d    a
        18  [6]    d    a
        19  [6]    d    a
        20  [6]    e    a

--> df.dtypes
        col1    object
        col2    object
        col3    object
        dtype: object

--> df.drop_duplicates(subset=['col1', 'col2', 'col3'], keep='last', inplace=True)
        
        ## TypeError: unhashable type: 'list' ##

## Here if I save it as an excel and load again, then this error does not come up ... ##

--> df.to_excel('test.xlsx')
--> df_ = pd.read_excel('test.xlsx')
--> df_.dtypes
        Unnamed: 0     int64
        col1    object
        col2    object
        col3    object
        dtype: object
--> df_.drop_duplicates(subset=['col1', 'col2', 'col3'], keep='last', inplace=True)
--> df_
         Unnamed: 0 col1 col2 col3
        8       8   [6]    c    a
        9       9   [1]    c    a
        11      11  [1]    d    a
        19      19  [6]    d    a
        20      20  [6]    e    a

这种行为有的解释吗?

扩展了对问题的跟踪

回溯(最近一次调用):

文件"",第1行,在

文件"C:\Users\Agnij\Anaconda3\lib\site-packages\pandas\core\frame.py",第4811行,在drop_duplicates中

复制=self.duplicated(子集,keep=keep)

文件"C:\Users\Agnij\Anaconda3\lib\site-packages\pandas\core\frame.py",第4888行,在重复标签中,shape =map(列表,zip(*map(f,vals)

文件"C:\Users\Agnij\Anaconda3\lib\site-packages\pandas\core\frame.py",第4863行,f值,size_hint=min(len(self),_SIZE_HINT_LIMIT)

文件"C:\Users\Agnij\Anaconda3\lib\site-packages\pandas\core\algorithms.py",第636行,以分解值、na_sentinel=na_sentinel、size_hint=size_hint、na_value=na_value为单位

文件"C:\Users\Agnij\Anaconda3\lib\site-packages\pandas\core\algorithms.py",第484行,在_factorize_array uniques中,code= table.factorize(values,na_sentinel=na_sentinel,na_value=na_value)

pandas._libs.hashtable.PyObjectHashTable.factorize中的"pandas_libs\hashtable_class_helper.pxi“文件,第1815行

pandas._libs.hashtable.PyObjectHashTable._unique中的文件"pandas_libs\hashtable_class_helper.pxi",第1731行

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-15 06:04:52

因为即使这两列都是dtype对象,它们中的项也是不同的类型:

代码语言:javascript
运行
复制
>>> df.loc[0,'col1']
[1]


>>> df_.loc[0, 'col1']
'[1]'

由于字符串是可选的,所以您不会看到以前使用列表时出现的错误。

票数 1
EN

Stack Overflow用户

发布于 2022-01-15 06:03:39

drop_duplicates对对象进行散列,以有效地跟踪已经看到或没有看到的对象。

list是不可接受的(因为它们是可变的),因此您不能直接在它们上使用drop_duplicates。保存和加载数据时,有可能将其转换为字符串,从而能够计算散列。

要克服这个问题,可以将列表转换为元组,这是可以理解的:

代码语言:javascript
运行
复制
df['col1'] = df['col1'].apply(tuple)
# now this runs with no error
df.drop_duplicates(subset=['col1', 'col2', 'col3'], keep='last', inplace=True)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70719215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档