Группировать и объединять строки в список серий или dicts в Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных с 7 миллионами строк, который выглядит следующим образом

 |    | ID     | VAL1 | VAL2
|---:|:-------|:-----|:----
|  0 | QWERTY | 1    | ABC
|  1 | 123456 | 2    | ABC
|  2 | QWERTY | 3    | ABC
|  3 | QWERTY | 4    | ABC
|  4 | 123456 | 5    | ABC
  
 df = pd.DataFrame(
    columns=("ID", "VAL1", "VAl2"),
    data=[("QWERTY", 1, "ABC"), ("123456", 2, "ABC"), ("QWERTY", 3, "ABC"), ("QWERTY", 4, "ABC"), ("123456", 5, "ABC")]
)
  

И я хочу сгруппировать его по идентификатору или преобразовать его в форму, подобную этой

 |    | ID     | GROUPED
|---:|:-------|:------------------------------------------------
|  0 | QWERTY | [{'ID': 'QWERTY', 'VAL1': 1, 'VAl2': 'ABC'}, {'ID': 'QWERTY', 'VAL1': 3, 'VAl2': 'ABC'}, {'ID': 'QWERTY', 'VAL1': 4, 'VAl2': 'ABC'}, ]
|  1 | 123456 | [{'ID': '123456', 'VAL1': 2, 'VAl2': 'ABC'}, {'ID': '123456', 'VAL1': 5, 'VAl2': 'ABC'}]
  

Он должен быть сгруппирован по идентификатору и иметь список с целыми строками, который соответствует этому идентификатору. Строки в списке могут быть либо сериями, либо Dict.


Я пытался сделать это таким образом

 test1 = df.groupby("ID").apply(lambda x: df.iloc[list(x.to_dict()["VAL1"].keys())])
  

Но он расширяет строки и создает мультииндекс вместо списка или чего-то еще

               ID  VAL1 VAl2
ID
123456 1  123456     2  ABC
       4  123456     5  ABC
QWERTY 0  QWERTY     1  ABC
       2  QWERTY     3  ABC
       3  QWERTY     4  ABC
  

Есть ли какой-нибудь способ сделать это с pandas?
К сожалению, простые циклы / карты python работают довольно медленно при работе с 5 миллионами строк.

Ответ №1:

Попробуйте это

 compact_df =  df.groupby('ID').apply(lambda group: group.to_dict(orient='records'))
  

Ответ №2:

Попробуйте это:

 test1 = df.groupby("ID").apply(lambda x: x.to_dict(orient='records'))

res=pd.DataFrame(test1, index=test1.index, columns=['GROUPED'])

>>> print(res)
                                                  GROUPED
ID
123456  [{'ID': '123456', 'VAL1': 2, 'VAl2': 'ABC'}, {...
QWERTY  [{'ID': 'QWERTY', 'VAL1': 1, 'VAl2': 'ABC'}, {...