Панды Консолидация одинаковых значений в одной строке - PullRequest
0 голосов
/ 29 августа 2018

Есть следующие данные:

  board_href_deals       items  test1
0            test2  {'x': 'a'}  test1
1            test2  {'x': 'b'}  test2

После группировки "board_href_deals", Я хотел бы вывести существующие данные в виде списка следующим образом:

 board_href_deals                     items     test1
0            test2  [{'x': 'a'}, {'x': 'b'}]    ['test1', 'test2']

спасибо

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Альтернативное решение, особенно в старых версиях Pandas, заключается в использовании GroupBy + apply в последовательности, а затем объединении через concat.

Сравнительный анализ на Python 3.60 / Pandas 0.19.2. Этот надуманный пример имеет небольшое количество групп; Вы должны проверить с вашими данными, если эффективность является проблемой.

import pandas as pd

df = pd.DataFrame({'A': ['test2', 'test2', 'test4', 'test4'],
                   'B': [{'x': 'a'}, {'x': 'b'}, {'y': 'a'}, {'y': 'b'}],
                   'C': ['test1', 'test2', 'test3', 'test4']})

df = pd.concat([df]*10000)

def jpp(df):
    g = df.groupby('A')
    L = [g[col].apply(list) for col in ['B', 'C']]
    return pd.concat(L, axis=1).reset_index()

%timeit jpp(df)                                 # 11.3 ms per loop
%timeit df.groupby('A').agg(lambda x: list(x))  # 20.5 ms per loop
0 голосов
/ 29 августа 2018

Использование DataFrameGroupBy.agg, протестировано в pandas 0.23.4:

df = df.groupby('board_href_deals', as_index=False).agg(list)
print (df)
  board_href_deals                     items           test1
0            test2  [{'x': 'a'}, {'x': 'b'}]  [test1, test2]

Спасибо @jpp за решение для старых панд:

df = df.groupby('board_href_deals').agg(lambda x: list(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...