Возвращает уникальные значения определенного столбца строка за строкой

#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