#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