我有一个Dataframe列,它是列表的集合
a
['a', 'b']
['b', 'a']
['a', 'c']
['c', 'a']
我想使用此列表按其唯一值(['a','b']& ['a','c'])进行分组。但是,这会产生错误
TypeError: unhashable type: 'list'
有没有办法解决这个问题。理想情况下,我想对值进行排序,并创建一个连续字符串的附加列。
答案 0 :(得分:6)
您还可以按列对值进行排序。
示例:
x = [['a', 'b'], ['b', 'a'], ['a', 'c'], ['c', 'a']]
df = pandas.DataFrame({'a': Series(x)})
df.a.sort_values()
a
0 [a, b]
2 [a, c]
1 [b, a]
3 [c, a]
但是,根据我的理解,您希望将[b, a]
排序为[a, b]
,将[c, a]
排序为[a, c]
,然后set
值,以便获取只有[a, b][a, c]
。
我建议使用lambda
尝试:
result = df.a.sort_values().apply(lambda x: sorted(x))
result = DataFrame(result).reset_index(drop=True)
它返回:
0 [a, b]
1 [a, c]
2 [a, b]
3 [a, c]
然后获得唯一值:
newdf = pandas.DataFrame({'a': Series(list(set(result['a'].apply(tuple))))})
newdf.sort_values(by='a')
a
0 (a, b)
1 (a, c)
答案 1 :(得分:3)
列表不可用。但是,元组是可以使用的
使用
df.groupby([df.a.apply(tuple)])
<强> 设置 强>
df = pd.DataFrame(dict(a=[list('ab'), list('ba'), list('ac'), list('ca')]))
的 结果 强>
df.groupby([df.a.apply(tuple)]).size()
a
(a, b) 1
(a, c) 1
(b, a) 1
(c, a) 1
dtype: int64