Панды объединяют несколько строк с разными столбцами в одну строку

#python #python-3.x #pandas

Вопрос:

У меня есть df фрейм данных со следующей характеристикой

идентификатор хранилища city_id продажа_а Продажи @ b распродажи_с
STORE01 ГОРОД99 100 Предметов Нет Нет
STORE01 ГОРОД99 Нет 200 Заказ Нет
STORE01 ГОРОД99 Нет Нет 300 Клиентов
STORE01 ГОРОД99 150 Заказ Нет 300 Клиентов

Все строки будут иметь одинаковые характеристики, где одинаковые store id и city ID имеют 1 строку или более:

  • строка 1 : продажи A имеют значение, другие нет
  • строка 2 : продажи B имеют значение, другие нет
  • строка 3 : продажи C имеют значение, другие нет
  • строка 4 : продажи A имеют значение (но отличаются от строки 1), других нет

Обратите внимание, что значение не является числом, они являются строковыми и должны храниться как строка

Порядок строк может быть разным, но в основном у каждого есть 1 или более строк, зависит от продаж.

В панд,как я могу объединить их в одну строку, чтобы результирующий набор данных был примерно таким :

идентификатор хранилища city_id продажа_а Продажи @ b распродажи_с
STORE01 ГОРОД99 100 Позиций, 150 Заказов 200 Заказ 300 Клиентов

Спасибо

Ответ №1:

Используйте пользовательскую лямбда-функцию с удалением None значений и дубликатов, последние значения объединения по , в GroupBy.agg :

 #if None are strings convert them to NoneType
#df = df.mask(df == 'None', None)


f = lambda x: ', '.join(x.dropna().unique())
df = df.groupby(['store_id','city_id'], as_index=False).agg(f)
print (df)
  store_id city_id              sales_A    sales_B     sales_C
0  STORE01  CITY99  100 Item, 150 Order  200 Order  300 Client
 

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

1. Извините, обновленный вопрос. 1 комбинация может содержать более одной строки в sales_A, sales_B или sales_C. Ваш подход работает, если у меня есть только одно значение NaN для каждой группы