[英]Pandas Unhashable type : 'list' when using describe()
我有一本字典,其中另一本字典作為其值,而另一本字典中具有列表作為其值。
例如,
{'A' : {'a' : ['1', '2', '3'], 'b' : ['4', '5'], 'c' : ['6']},
'B' : {'a' : ['7'], 'b' : ['8', '9']}}
我想制作一個以A
, B
作為索引, a
, b
, c
作為列的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.