Pandas Unhashable type: 'list' при использовании description () - PullRequest
0 голосов
/ 15 мая 2018

У меня есть словарь, для которого в качестве значения используется другой словарь, а для другого словаря - значение.
Например,

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

Я хочу создать Pandas DataFrame, который имеет A, B в качестве индексов, a, b, c в качестве столбцов.

То, что я сделал, это:

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

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Значения будут объектами списка.Из-за этого вы можете просто использовать конструктор 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

Или вы можете сложить результирующий второй уровень атрибута столбцов.

df.stack().describe()


        a  b  c
count   4  4  1
unique  4  4  1
top     1  8  6
freq    1  1  1
0 голосов
/ 15 мая 2018

Так как ошибка говорит о хэшабельности, я сначала изменил бы внутренние списки на кортеж:

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: unhashable тип: 'dict'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...