Как реализовать "GROUP_CONCAT" из MySQL в Pandas?
Есть таблица "new_":
| g_id | bg_id | gs_width | gs_height |
|---|---|---|---|
| 1179 | 284 | 1 | 0.499941 |
| 1180 | 284 | 0.467223 | 0.958212 |
| 1181 | 285 | 1 | 0.499941 |
| 1182 | 285 | 0.467223 | 0.958212 |
| 1187 | 288 | 1 | 0.499941 |
| 1188 | 288 | 0.467223 | 0.958212 |
| 1193 | 291 | 1 | 0.499941 |
| 1194 | 291 | 0.467223 | 0.958212 |
| 1195 | 292 | 1 | 0.499941 |
| 1196 | 292 | 0.467223 | 0.958212 |
Делаю к ней запрос через SQL:
SELECT
GROUP_CONCAT(new_.g_id) as 'g_id',
new_.bg_id as 'bg_id',
GROUP_CONCAT(new_.gs_height) as 'gs_height',
GROUP_CONCAT(new_.gs_width) as 'gs_width'
FROM
new_
GROUP BY
new_.bg_id;
Дает такой результат:
| g_id | bg_id | gs_height | gs_width |
|---|---|---|---|
| "1179,1180" | 284 | "0.499941,0.958212" | "1,0.467223" |
| "1181,1182" | 285 | "0.499941,0.958212" | "1,0.467223" |
| "1187,1188" | 288 | "0.499941,0.958212" | "1,0.467223" |
| "1194,1193" | 291 | "0.958212,0.499941" | "0.467223,1" |
| "1195,1196" | 292 | "0.499941,0.958212" | "1,0.467223" |
Пытаюсь получить такой же результат через DataFrame:
import pandas as pd
import numpy as np
data_lst = [
[1179, 284, 1.0, 0.499941],
[1180, 284, 0.467223, 0.958212],
[1181, 285, 1.0, 0.499941],
[1182, 285, 0.467223, 0.958212],
[1187, 288, 1.0, 0.499941],
[1188, 288, 0.467223, 0.958212],
[1193, 291, 1.0, 0.499941],
[1194, 291, 0.467223, 0.958212],
[1195, 292, 1.0, 0.499941],
[1196, 292, 0.467223, 0.958212]
]
df_in = pd.DataFrame(np.array([[str(j) for j in i] for i in data_lst]),
columns=['g_id', 'bg_id', 'gs_width', 'gs_height'])
df_out = df_in.groupby(['g_id', 'gs_width', 'gs_height'], as_index=False).agg({'bg_id': ' '.join})
print(df_out)
Но получаю следующее:
g_id gs_width gs_height bg_id
0 1179 1.0 0.499941 284
1 1180 0.467223 0.958212 284
2 1181 1.0 0.499941 285
3 1182 0.467223 0.958212 285
4 1187 1.0 0.499941 288
5 1188 0.467223 0.958212 288
6 1193 1.0 0.499941 291
7 1194 0.467223 0.958212 291
8 1195 1.0 0.499941 292
9 1196 0.467223 0.958212 292
А если сделать так:
df_groupGr_gID = df_groupGr.groupby(['bg_id', 'gs_width', 'gs_height'], as_index=False).agg({'g_id': ', '.join})
То будет такой результат:
bg_id gs_width gs_height g_id
0 284 0.467223 0.958212 1180
1 284 1.0 0.499941 1179
2 285 0.467223 0.958212 1182
3 285 1.0 0.499941 1181
4 288 0.467223 0.958212 1188
5 288 1.0 0.499941 1187
6 291 0.467223 0.958212 1194
7 291 1.0 0.499941 1193
8 292 0.467223 0.958212 1196
9 292 1.0 0.499941 1195
Что не так я сделал? Как сделать вывод такой же как в SQL-запросе?
UPD:
Если сделать так:
df_groupGr_gID = df_groupGr.groupby(['bg_id'], as_index=False).agg({'g_id': ', '.join})
То получается похожий уже вариант, но теряется часть данных(нет других полей):
bg_id g_id
0 284 1179, 1180
1 285 1181, 1182
2 288 1187, 1188
3 291 1193, 1194
4 292 1195, 1196
Ответы (1 шт):
Автор решения: Алексей Белкин
→ Ссылка
Не знаю на сколько это правильно, но я решил это таким способом:
df_groupGr_gID = df_groupGr.groupby(['bg_id'], as_index=False).agg({i: ', '.join for i in ['g_id', 'gs_width', 'gs_height']})