在Pandas数据框中按列对列表进行排序

11

我有一个数据框的列,它是一个列表集合

    a
['a', 'b']
['b', 'a']
['a', 'c']
['c', 'a']

我想使用这个列表按其唯一值(['a', 'b']&['a', 'c'])进行分组。然而,这会生成一个错误。

TypeError: unhashable type: 'list'

有没有任何方法可以解决这个问题。理想情况下,我想原地对值进行排序并创建一个附加的字符串列。


1
你想要什么样的输出? - IanS
1
你的输入是什么? - estebanpdl
2个回答

14

您还可以按列对值进行排序。

示例:

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],然后按顺序设置值,以便仅获得[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
谢谢。我采纳了同事的建议,使用了t us np.where,代码如下:df['b'] = np.where(df.a[0] < df.a[1], df.a[0] + df.a[1], df.a[1] + df.a[0])。这使我得到了一个排序后的唯一值的列。 - Jack Cooper
2
你也可以使用 apply(sorted),因为它等同于 apply(lambda x: sorted(x)) - 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接