Python 在pandas中合并三个以上的类似表会导致列名过度折叠
我正在尝试合并5个相似的表,其中每个表都有相同的列名集,但年份不同。最终目标是一个包含21列(4列x 5个表,名称列+1)的表,以及与内部合并匹配的行数 为了适应这种情况,类似的列名通常会被重命名为“_y”、“_x”等后缀,以便在新的合并表中区分它们 但在我的例子中,第3列和第4列表中的名称被赋予了与第1列和第2列表相同的后缀(第5列表似乎没有后缀,即原始列名)。这导致合并表中出现一些精确的列名,从而使下游操作复杂化。为什么呢?我想知道.merge函数为什么会这样。我知道在合并之前可以通过重新标记原始dfs来保留所需的格式,但我很好奇为什么函数会显示上述行为* 以下是可复制的数据: 以及我用来合并数据的操作:Python 在pandas中合并三个以上的类似表会导致列名过度折叠,python,pandas,merge,Python,Pandas,Merge,我正在尝试合并5个相似的表,其中每个表都有相同的列名集,但年份不同。最终目标是一个包含21列(4列x 5个表,名称列+1)的表,以及与内部合并匹配的行数 为了适应这种情况,类似的列名通常会被重命名为“_y”、“_x”等后缀,以便在新的合并表中区分它们 但在我的例子中,第3列和第4列表中的名称被赋予了与第1列和第2列表相同的后缀(第5列表似乎没有后缀,即原始列名)。这导致合并表中出现一些精确的列名,从而使下游操作复杂化。为什么呢?我想知道.merge函数为什么会这样。我知道在合并之前可以通过重新标
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),以及与内部合并匹配的行数。这是因为每个表代表一年,每行代表一个玩家。这样做的目的是跟踪玩家的进度。这在我最初的问题中是不清楚的,所以我会澄清的,谢谢。我无法想象一个应用程序,在这个应用程序中,您需要跟踪所有愚蠢的附加列名,这样做会更好。以上是一种非常通用的“平面”格式。你想对所有列的数据做什么?看起来对于图表来说,堆叠是最好的做法,所以你是正确的。谢谢你的帮助