簡體   English   中英

熊貓Unhashable類型:使用describe()時的“列表”

[英]Pandas Unhashable type : 'list' when using describe()

我有一本字典,其中另一本字典作為其值,而另一本字典中具有列表作為其值。
例如,

{'A' : {'a' : ['1', '2', '3'], 'b' : ['4', '5'], 'c' : ['6']},  
'B' : {'a' : ['7'], 'b' : ['8', '9']}}

我想制作一個以AB作為索引, abc作為列的Pandas DataFrame。

我所做的是:

df = pd.DataFrame.from_dict(dictionary, orient='index')  
df.describe()

但我收到一個錯誤消息:


TypeError                                 Traceback (most recent call last)
<ipython-input-6-88dc07bc979e> in <module>()
      6 df = pd.DataFrame.from_dict(dict_data, orient='index')  
----> 7 df.describe() # print df  

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in  
 describe(self, percentiles, include, exclude)  
   6825             data = self.select_dtypes(include=include, exclude=exclude)  
   6826   
-> 6827         ldesc = [describe_1d(s) for _, s in data.iteritems()]  
   6828         # set a convenient order for rows  
   6829         names = []  

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in <listcomp>(.0)  
   6825             data = self.select_dtypes(include=include, exclude=exclude)
   6826 
-> 6827         ldesc = [describe_1d(s) for _, s in data.iteritems()]
   6828         # set a convenient order for rows
   6829         names = []

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in describe_1d(data)
   6808                 return describe_numeric_1d(data)
   6809             else:
-> 6810                 return describe_categorical_1d(data)
   6811 
   6812         if self.ndim == 1:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in describe_categorical_1d(data)
   6782         def describe_categorical_1d(data):
   6783             names = ['count', 'unique']
-> 6784             objcounts = data.value_counts()
   6785             count_unique = len(objcounts[objcounts != 0])
   6786             result = [data.count(), count_unique]

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\base.py in value_counts(self, normalize, sort, ascending, bins, dropna)
    869         from pandas.core.algorithms import value_counts
    870         result = value_counts(self, sort=sort, ascending=ascending,
--> 871                               normalize=normalize, bins=bins, dropna=dropna)
    872         return result
    873 

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\algorithms.py in value_counts(values, sort, ascending, normalize, bins, dropna)
    550 
    551         else:
--> 552             keys, counts = _value_counts_arraylike(values, dropna)
    553 
    554             if not isinstance(keys, Index):

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\algorithms.py in _value_counts_arraylike(values, dropna)
    595         # TODO: handle uint8
    596         f = getattr(htable, "value_count_{dtype}".format(dtype=ndtype))
--> 597         keys, counts = f(values, dropna)
    598 
    599         mask = isna(values)

pandas/_libs/hashtable_func_helper.pxi in pandas._libs.hashtable.value_count_object()

pandas/_libs/hashtable_func_helper.pxi in pandas._libs.hashtable.value_count_object()

TypeError: unhashable type: 'list'

我該如何解決?

我想要類似的結果

    a           b       c
A   1   2   3   4   5   6
B   7           8   9

這些值將是列表對象。 因此,您可以簡單地使用DataFrame構造函數並轉置。 之所以提到列表對象,是因為我通常會避免進行構造和轉置,因為這可能會使dtypes混亂。 但是在這種情況下,dtyes仍然是對象。

d = {
    'A' : {'a' : ['1', '2', '3'], 'b' : ['4', '5'], 'c' : ['6']},
    'B' : {'a' : ['7'], 'b' : ['8', '9']}
}

pd.DataFrame(d).T

           a       b    c
A  [1, 2, 3]  [4, 5]  [6]
B        [7]  [8, 9]  NaN

但是,問題在於嘗試描述列表。 有什么意義? 我猜您想在列表中描述數字。 如果是這樣,我將像這樣構造:

df = pd.DataFrame.from_dict({
    i: {(j, k): v for j, x in d_.items() for k, v in enumerate(x)}
    for i, d_ in d.items()
}, orient='index')

df

   a            b       c
   0    1    2  0  1    0
A  1    2    3  4  5    6
B  7  NaN  NaN  8  9  NaN

然后您可以描述

df.describe()

        a        b     c
        0  1  2  0  1  0
count   2  1  1  2  2  1
unique  2  1  1  2  2  1
top     1  2  3  8  5  6
freq    1  1  1  1  1  1

或者,您可以堆疊結果所得的columns屬性的第二層。

df.stack().describe()


        a  b  c
count   4  4  1
unique  4  4  1
top     1  8  6
freq    1  1  1

由於錯誤說明了可哈希性,因此我首先將內部列表更改為元組:

d = {'A' : {'a' : ['1', '2', '3'], 'b' : ['4', '5'], 'c' : ['6']},
'B' : {'a' : ['7'], 'b' : ['8', '9']}}

flat = [(k, v.items()) for k,v in d.items()]
d2 = dict()
for k, kv2 in flat:
    dd_pairs = []
    for k2, v2 in kv2:
        dd_pairs.append( (k2,tuple(v2)) )
    d2[k] = dict(dd_pairs)

這應該解除您的封鎖...

這里描述了非常相似的問題: 數組中的Pandas Multiindex => TypeError:不可哈希類型:'dict'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM