Группировка и агрегирование по столбцам дублирует столбцы в пандах - PullRequest
0 голосов
/ 23 сентября 2019

Я объединяю две таблицы left_table и right_table для неуникальных ключей, что приводит к взрыву строк.Затем я хочу объединить строки, чтобы соответствовать количеству строк в left_table.Для этого я агрегирую по столбцам left_table.Странно, когда я сохраняю таблицу, столбцы в left_table удваиваются.Кажется, что столбцы left_table становятся индексом для результирующего кадра данных ...

Левая таблица

    k1  k2   s   v  c  target
0   1   3  20  40  2       2
1   1   2  10  20  1       1
2   1   2  10  80  2       1

Правая таблица

    k11  k22  s2   v2
0    1    2   0  100
1    2    3  30  200
2    1    2  10  300

Левое соединение

    k1  k2   s   v  c  target    s2     v2
0   1   3  20  40  2       2   NaN    NaN
1   1   2  10  20  1       1   0.0  100.0
2   1   2  10  20  1       1  10.0  300.0
3   1   2  10  80  2       1   0.0  100.0
4   1   2  10  80  2       1  10.0  300.0

Код агрегации

dic = {}
keys_to_agg_over = left_table_col_names

for col in numeric_cols:
    if col in all_cols:
           dic[col] = 'median'

left_join = left_join.groupby(keys_to_agg_over).aggregate(dic)

После агрегации (удвоенное число левых столбцов таблицы)

                       k1  k2   s   v  c  target   s2     v2
k1 k2 s  v  c target                                       
1  2  10 20 1 1        1   2  10  20  1       1  5.0  200.0
         80 2 1        1   2  10  80  2       1  5.0  200.0
   3  20 40 2 2        1   3  20  40  2       2  NaN    NaN

Сохранено в файл CSV

k1,k2,s,v,c,target,k1,k2,s,v,c,target,s2,v2
1,2,10,20,1,1,1,2,10,20,1,1,5.0,200.0
1,2,10,80,2,1,1,2,10,80,2,1,5.0,200.0
1,3,20,40,2,2,1,3,20,40,2,2,,

Iпопытался сбросить индекс, как left_join.reset_index(), но я получаю

ValueError: cannot insert target, already exists 

Как решить проблему удвоения столбцов?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

У вас есть несколько вариантов:

  1. Сохранить CSV, не включая индекс: Я полагаю, вы используете метод to_csv для сохранения результата в CSV.По умолчанию он включает в себя индексные столбцы в сгенерированном CSV.вы можете сделать to_csv(index=False), чтобы избежать их сохранения.

  2. reset_index, удалив его: вы можете использовать left_join.reset_index(drop=True), чтобы отбросить столбцы индекса и не добавлять их в кадр данных.По умолчанию reset_index добавляет текущие столбцы индекса к кадру данных, генерируя полученный вами ValueError.

0 голосов
/ 23 сентября 2019

Кажется, что вы используете:

left_join = left_table.merge(right_table, left_on = ["k1", "k2"], "right_on" = ["k11", "k22"] , how = "left")

Это приведет к созданию кадра данных с повторяющимися строками, поскольку индексы 1 и 2 из левой таблицы могут быть объединены с индексами 0 и 2 правой таблицы,Если это поведение, которое вы ожидали, и просто хотите избавиться от дублированных строк, вы можете попробовать использовать:

left_join = left_join.drop_duplicates()

Перед агрегированием.Это решение не остановит дублирование строк, оно скорее исключит их, чтобы не вызывать проблем.

Вы также можете передать параметр as_index = False в функцию groupby, например:

left_join = left_join.groupby(keys_to_agg_over, as_index = False).aggregate(dic)

Чтобы перестать получать «группирующие столбцы» в качестве индексов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...