Групповые мультииндексные панды, использующие agg для суммирования и применения списка - PullRequest
0 голосов
/ 23 октября 2018

У меня есть две многоиндексные серии

серии 1

Company Name     Product     Price        TransactionID
Company A        Apple       10           T0001
Company B        Grapes      20           T0002
                 Orange      30           T0003

серии 2

Company Name     Product     Price        TransactionID
Company A        Orange      10           T0004
                 Apple       20           T0005
Company B        Orange      20           T0006

Я хочу сформировать серию, как показано ниже

Company Name     Product     Sum_price    TransactionID
Company A        Orange      10           [T0004]
                 Apple       30           [T0001,T0005]
Company B        Orange      50           [T0003,T0006]
                 Grapes      20           [T0002]

Из Группировать фрейм данных и получать сумму И рассчитывать? показывает, что я могу использовать .agg для одновременного выполнения суммирования и подсчета, но как применить .apply (список) и суммирование вместе?Прямо сейчас я применил код Pandas: добавление многоиндексных серий / информационных фреймов, содержащих списки , чтобы сформировать две серии: одна сумма, а другая с транзакциейID.Я думаю, что могу объединить две серии вместе, но я просто хочу посмотреть, есть ли лучший способ сделать это.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Используйте concat с агрегированием по aggregate с sum и преобразованием в list:

df = (pd.concat([df1, df2])
        .groupby(['Company Name', 'Product'], as_index=False)
        .agg({'Price':'sum', 'TransactionID': lambda x: x.tolist()})
     )
print (df)
  Company Name Product  Price   TransactionID
0    Company A   Apple     30  [T0001, T0005]
1    Company A  Orange     10         [T0004]
2    Company B  Grapes     20         [T0002]
3    Company B  Orange     50  [T0003, T0006]
0 голосов
/ 23 октября 2018

Вы можете сначала объединить оба ваших кадра данных следующим образом:

df3 = pd.concat([df1, df2])

После этого вы можете использовать groupby agg для суммирования, а также лямбда-функцию для объединения списков

df3 = df3.groupby(['Company', 'Name', 'Product']).agg({'Price':sum, 'TransactionID': lambda x: [i for i in x]})

После этого вы получите желаемый результат:

Company Name     Product     Sum_price    TransactionID
Company A        Orange      10           [T0004]
                 Apple       30           [T0001,T0005]
Company B        Orange      50           [T0003,T0006]
                 Grapes      20           [T0002]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...