Python 在pandas中合并三个以上的类似表会导致列名过度折叠

Python 在pandas中合并三个以上的类似表会导致列名过度折叠,python,pandas,merge,Python,Pandas,Merge,我正在尝试合并5个相似的表,其中每个表都有相同的列名集,但年份不同。最终目标是一个包含21列(4列x 5个表,名称列+1)的表,以及与内部合并匹配的行数 为了适应这种情况,类似的列名通常会被重命名为“_y”、“_x”等后缀,以便在新的合并表中区分它们 但在我的例子中,第3列和第4列表中的名称被赋予了与第1列和第2列表相同的后缀(第5列表似乎没有后缀,即原始列名)。这导致合并表中出现一些精确的列名,从而使下游操作复杂化。为什么呢?我想知道.merge函数为什么会这样。我知道在合并之前可以通过重新标

我正在尝试合并5个相似的表,其中每个表都有相同的列名集,但年份不同。最终目标是一个包含21列(4列x 5个表,名称列+1)的表,以及与内部合并匹配的行数

为了适应这种情况,类似的列名通常会被重命名为“_y”、“_x”等后缀,以便在新的合并表中区分它们

但在我的例子中,第3列和第4列表中的名称被赋予了与第1列和第2列表相同的后缀(第5列表似乎没有后缀,即原始列名)。这导致合并表中出现一些精确的列名,从而使下游操作复杂化。为什么呢?我想知道.merge函数为什么会这样。我知道在合并之前可以通过重新标记原始dfs来保留所需的格式,但我很好奇为什么函数会显示上述行为*

以下是可复制的数据:

以及我用来合并数据的操作:

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,但命名问题除外**:

当我打印出生成的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']
*编辑1
**编辑2

使用您关于年份的评论中的信息,您应该:

  • 将年份添加到每个数据框以保留信息
  • 合并或连接它们
应该是这样的:

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

您是否正在尝试将它们与原始列和所有数据合并到一个数据集中?如果是,您是否尝试了“外部”连接?然后你可以按姓名分组?@JeffH,是的,但我认为这不能解决问题。我确实试过了,以防万一我遗漏了什么,但这不会改变列名的处理方式。你只想将五个数据帧合并成一个数据帧,对吗?例如,如果每个数据帧有5列和4条记录,并且有5个这样的数据帧(在您的例子中),那么生成的数据帧将有5列和20条记录,对吗?@vatsalgosar,它实际上是21列(4列x 5个表,名称列+1),以及与内部合并匹配的行数。这是因为每个表代表一年,每行代表一个玩家。这样做的目的是跟踪玩家的进度。这在我最初的问题中是不清楚的,所以我会澄清的,谢谢。我无法想象一个应用程序,在这个应用程序中,您需要跟踪所有愚蠢的附加列名,这样做会更好。以上是一种非常通用的“平面”格式。你想对所有列的数据做什么?看起来对于图表来说,堆叠是最好的做法,所以你是正确的。谢谢你的帮助