#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 для каждой группы