#python #python-3.x #dataframe
Вопрос:
У меня есть следующее dataframe
column1 column2 0 Paul xx 1 John aa 2 Paul gg 3 John xx 4 John bb 5 George gg 6 Paul gg 7 john xx . n Jonathan ff
Я хочу, чтобы информация о каждом человеке была в одном ряду. На том же row
я хочу иметь то же самое index
, но в другом column
. Поэтому я хочу dataframe
вот так:
column1 column2 column3 0 Paul 0,2,6 xx, gg, gg 1 John 1,3,4,7 aa, xx, bb, xx 5 George 5 gg . . . n Jonathan n ff
Для того, чтобы сделать вышесказанное dataframe
, я выполняю
df2 = df.reset_index().groupby('column1').agg(list).reset_index() ix = pd.Index(df2['index'].str.get(0)).rename(None) df3 = df2.set_index(ix).sort_index() df3
Который возвращает:
column1 index column2 0 Paul [0, 2, 6] [xx, gg, gg] 1 John [1, 3, 4, 7] [aa, xx, bb,xx] 5 George [5] [gg]
После этого я удаляю column1
и index
. Чтобы значения column2
были в формате, не представленном при list
выполнении:
def transform_list(df3): df3['column2'] = df3['column2'].apply(lambda x: ','.join(x)) return df3 dfb=transform_list(df3) df3.head()
которые возвращаются:
column2 0 xx, gg, gg 1 aa, xx, bb,xx 5 gg
Так что теперь я хочу, чтобы у каждого были уникальные ценности row
так что мой финал dataframe
будет
column2 0 xx, gg 1 aa, xx, bb 5 gg
Есть какие-нибудь идеи?
Комментарии:
1.
','.join(set(x))
?
Ответ №1:
До тех пор, пока порядок элементов в выводе не имеет значения, вы можете переопределить свою функцию следующим образом:
def transform_list(df3): df3['column2'] = df3['column2'].apply(lambda x: ','.join(set(x))) return df3
Набор по своей сути содержит только уникальные элементы, поэтому преобразование списка x
в набор приведет к удалению любых дубликатов. Однако наборы по своей сути неупорядочены, поэтому вы можете получить непреднамеренные результаты, если важен порядок.
Если заказ имеет значение, вы можете использовать версию
def transform_list(df3): df3['column2'] = df3['column2'].apply(lambda x: ','.join(list(dict.fromkeys(x)))) return df3
Это создает словарь (который упорядочен по вставке) с ключами из вашего первоначального списка x
, и поскольку ключи нельзя определить с помощью умножения, мы получаем только уникальные элементы. При обратном преобразовании в список ключи берутся из словаря, а остальная часть рабочего процесса может продолжаться по мере необходимости без изменений.
Ответ №2:
Вы можете преобразовать каждый список в набор, а затем снова в список, чтобы исключить дубликаты записей. Это можно сделать в рамках вашей лямбда-функции:
import pandas as pd df = pd.DataFrame({'column2': [['xx', 'gg', 'gg'], ['aa', 'xx', 'bb', 'xx'], ['gg']]}, index=[0, 1, 5]) df['column2'] = df.column2.apply(lambda x: ', '.join(list(set(x)))) df
column2 0 gg, xx 1 bb, xx, aa 5 gg