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

2024-09-27 21:25:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但在我的例子中,第3列和第4列表中的名称被赋予了与第1列和第2列表相同的后缀(第5列表似乎没有后缀,即原始列名)。这导致合并表中出现一些精确的列名,从而使下游操作复杂化。为什么呢?我想知道.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']

*编辑1 **编辑2


Tags: 函数名称df列表merge后缀skilldfs
1条回答
网友
1楼 · 发布于 2024-09-27 21:25:26

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

  • 将年份添加到每个数据框以保留信息
  • 合并或连接它们

应该是这样的:

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

相关问题 更多 >

    热门问题