#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'}, {...