Сортировка списков в столбце фрейма данных Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть столбец фрейма данных, который представляет собой набор списков

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

Я хотел бы использовать этот список для группировки по его уникальным значениям ([‘a’, ‘b’] amp; [‘a’, ‘c’]). Однако это приводит к ошибке

 TypeError: unhashable type: 'list'
  

Есть ли какой-либо способ обойти это. В идеале я хотел бы отсортировать значения на месте и создать дополнительный столбец объединенной строки.

Комментарии:

1. Каков ваш желаемый результат?

2. Каков ваш вклад?

Ответ №1:

Вы также можете сортировать значения по столбцам.

Пример:

 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. Спасибо. Я пошел с предложением от коллеги, которое было 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]) . Это дает мне отсортированный столбец уникальных значений.

2. Вы также можете использовать apply(sorted) , поскольку это эквивалентно apply(lambda x: sorted(x))

Ответ №2:

список нельзя хэшировать. однако кортежи являются хешируемыми

использование

 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