三行代码  ›  专栏  ›  技术社区  ›  Agnij

Python熊猫:删除重复项函数-异常行为

  •  0
  • Agnij  · 技术社区  · 1 周前

    错误->TypeError:不可损坏的类型:“列表” 消失 保存数据帧并再次加载后。。。

    两个数据帧[保存和加载,生成]都具有 相同的数据类型 ...

    可复制->

    --> 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行,重复放置

    文件“C:\Users\Agnij\Anaconda3\lib\site packages\pandas\core\frame.py”,第4888行,一式两份 标签,形状=地图(列表,zip(*地图(f,VAL)))

    文件“C:\Users\Agnij\Anaconda3\lib\site packages\pandas\core\frame.py”,第4863行,f VAL,大小提示=最小值(长度(自身),\u大小提示\u限制)

    文件“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行,在数组uniques中,代码=表。因子分解(值,na_sentinel=na_sentinel,na_值=na_值)

    文件“pandas_libs\hashtable_class_helper.pxi”,第1815行,在pandas中_图书馆。哈希表。PyObjectHashTable。因式分解

    文件“pandas_libs\hashtable_class_helper.pxi”,第1731行,在pandas中_图书馆。哈希表。PyObjectHashTable_唯一的

    2 回复  |  直到 1 周前
        1
  •  2
  •   mozway    1 周前

    drop_duplicates 对对象进行散列,以高效地跟踪哪些对象已被看到或未被看到。

    list s是不可散列的(因为它们是可变的),因此不能直接在它们上使用drop\u副本。当您保存并加载数据时,很可能会将其转换为字符串,从而可以计算哈希值。

    要解决此问题,可以将列表转换为元组,元组可以散列:

    df['col1'] = df['col1'].apply(tuple)
    # now this runs with no error
    df.drop_duplicates(subset=['col1', 'col2', 'col3'], keep='last', inplace=True)
    
        2
  •  1
  •   enke    1 周前

    因为即使两列都是数据类型对象,其中的项目也是不同的类型:

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

    因为字符串是可散列的,所以您不会看到以前在列表中出现的错误。