Объединение более трех одинаковых таблиц в pandas приводит к переопределению имен столбцов - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь объединить 5 одинаковых таблиц, в каждой из которых есть одинаковый набор имен столбцов, но за 5 разных лет. Конечной целью является таблица с 21 столбцом (4 столбца x 5 таблиц, +1 для столбца имени) и тем не менее множеством строк, соответствующих внутреннему слиянию.

Для этого аналогичные имена столбцов обычно переименовываются с постфиксами вроде '_y', '_x' и др. c. чтобы дифференцировать их в новой объединенной таблице.

Но в моем случае имена из столбцов 3-й и 4-й таблиц получают те же постфиксы, что и 1-й и 2-й таблиц (у 5-й таблицы, похоже, нет постфиксов, ie исходные имена столбцов). Это привело к появлению некоторых точных имен столбцов в объединенной таблице, что усложняет pandas операций в нисходящем направлении. Это почему? Мне интересно, почему функция .merge ведет себя так. Я знаю, что могу сохранить желаемый формат путем перемаркировки исходных dfs перед объединением, но мне любопытно, почему функция отображает вышеуказанное поведение *.

Вот реплицируемые данные: https://pastebin.com/WEjqmKyz

И операции, которые я использую для объединения данных:

import pandas as pd
import functools

df_list = [df1, df1, df3, df4, df5]

end_df = reduce(lambda left,right: pd.merge(left,right,on='name'), df_list)

Это приводит к правильному df, за исключением проблемы с именами **:

enter image description here

Когда я распечатываю имена получаемых столбцов dfs, я получаю следующее:

 ['name',
 'attacking_crossing_x',
 'skill_dribbling_x',
 'defending_standing_tackle_x',
 'valuation_x',
 'attacking_crossing_y',
 'skill_dribbling_y',
 'defending_standing_tackle_y',
 'valuation_y',
 'attacking_crossing_x',
 'skill_dribbling_x',
 'defending_standing_tackle_x',
 'valuation_x',
 'attacking_crossing_y',
 'skill_dribbling_y',
 'defending_standing_tackle_y',
 'valuation_y',
 'attacking_crossing',
 'skill_dribbling',
 'defending_standing_tackle',
 'valuation']

* edit 1 ** edit 2

1 Ответ

0 голосов
/ 04 мая 2020

Используя информацию в ваших комментариях о годах, вы должны:

  • добавить год к каждому фрейму данных, чтобы сохранить информацию
  • объединить или объединить их

Это должно работать так:

In [47]: df1                                                                                                       
Out[47]: 
              name  attacking_crossing  skill_dribbling  defending_standing_tackle  valuation
0     Lionel Messi                -4.0              0.0                        2.0       0.00
1      Luis Suárez                 0.0             -2.0                        0.0      23.56
2           Neymar                 0.0              0.0                        0.0      24.70
3  Sergio Busquets                 0.0              0.0                        2.0       0.95

In [48]: df2                                                                                                       
Out[48]: 
              name  attacking_crossing  skill_dribbling  defending_standing_tackle  valuation
0     Lionel Messi                -3.0              1.0                        5.0        0.0
1      Luis Suárez                 0.0             -2.0                        0.0       15.2
2           Neymar                 4.0              2.0                        0.0       15.2
3  Sergio Busquets                 0.0              0.0                        0.0       15.2

In [49]: dfs = [df1, df2, df3, df4, df5]                                                                           

In [50]: years = [1990, 1991, 1992, 1993, 1994]                                                                    

In [51]: for year, frame in zip(years, dfs): 
    ...:     frame['year'] = year 
    ...:                                                                                                           

In [52]: df1                                                                                                       
Out[52]: 
              name  attacking_crossing  skill_dribbling  defending_standing_tackle  valuation  year
0     Lionel Messi                -4.0              0.0                        2.0       0.00  1990
1      Luis Suárez                 0.0             -2.0                        0.0      23.56  1990
2           Neymar                 0.0              0.0                        0.0      24.70  1990
3  Sergio Busquets                 0.0              0.0                        2.0       0.95  1990

In [53]: df2                                                                                                       
Out[53]: 
              name  attacking_crossing  skill_dribbling  defending_standing_tackle  valuation  year
0     Lionel Messi                -3.0              1.0                        5.0        0.0  1991
1      Luis Suárez                 0.0             -2.0                        0.0       15.2  1991
2           Neymar                 4.0              2.0                        0.0       15.2  1991
3  Sergio Busquets                 0.0              0.0                        0.0       15.2  1991

In [54]: df_all = pd.concat(dfs, ignore_index=True)                                                                

In [55]: df_all                                                                                                    
Out[55]: 
                name  attacking_crossing  skill_dribbling  defending_standing_tackle  valuation  year
0       Lionel Messi                -4.0              0.0                        2.0      0.000  1990
1        Luis Suárez                 0.0             -2.0                        0.0     23.560  1990
2             Neymar                 0.0              0.0                        0.0     24.700  1990
3    Sergio Busquets                 0.0              0.0                        2.0      0.950  1990
4       Lionel Messi                -3.0              1.0                        5.0      0.000  1991
5        Luis Suárez                 0.0             -2.0                        0.0     15.200  1991
6             Neymar                 4.0              2.0                        0.0     15.200  1991
7    Sergio Busquets                 0.0              0.0                        0.0     15.200  1991
8       Lionel Messi                 0.0              0.0                        0.0      0.000  1992
9             Neymar                 0.0              0.0                        0.0     19.000  1992
10       Luis Suárez                 0.0              0.0                        0.0      0.000  1992
11       Luka Modric                 0.0              0.0                        0.0     -8.550  1992
12      Lionel Messi                 0.0              0.0                        0.0     60.800  1993
13       Luis Suárez                 0.0              1.0                        0.0    -20.900  1993
14            Neymar                 4.0              0.0                        0.0     72.200  1993
15       Gareth Bale                 0.0             -2.0                        0.0     -7.125  1993
16      Lionel Messi                11.0              0.0                        9.0    -26.600  1994
17       Luis Suárez                 1.0             -2.0                        0.0    -24.700  1994
18            Neymar                 2.0              2.0                        0.0     52.440  1994
19  Leonardo Bonucci                 0.0              0.0                        0.0     -7.980  1994
...