Python 按数字组合数据帧
我有3个熊猫数据帧,分别命名为Python 按数字组合数据帧,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有3个熊猫数据帧,分别命名为df1、df2和df3 df1: match_up result 0 1985_1116_1234 1 1 1985_1120_1345 1 2 1985_1207_1250 1 3 1985_1229_1425 1 4 1985_1242_1325 1 5 1986_1116_1430 0 6 1986_1250_ 1229 0 7 198
df1
、df2
和df3
df1:
match_up result
0 1985_1116_1234 1
1 1985_1120_1345 1
2 1985_1207_1250 1
3 1985_1229_1425 1
4 1985_1242_1325 1
5 1986_1116_1430 0
6 1986_1250_ 1229 0
7 1986_1207_1437 1
df2:
team_df2 win_df2
1207 0.700
1116 0.636
1120 0.621
1229 0.615
1242 0.679
1116 0.742
1207 0.567
1250 0.342
df3:
team_df3 win_df3
1234 0.667
1250 0.759
1325 0.774
1345 0.742
1425 0.667
1229 0.845
1430 0.434
1437 0.123
数据框df2
中的team\u df2
列是数据框df1
中变量年份(1985年)之后的值。列team\u df3
是变量year\u val1
(1985年~1116年~
df2
和df3
中的前5行表示1985年,数据框df2
和df3
中的最后3行表示1986年
我需要一个新的_数据_帧,以以下格式组合df1、df2和df3:
match_up result team_df2 team_df3 win_df2 win_df3
0 1985_1116_1234 1 1116 1234 0.636 0.667
1 1985_1120_1345 1 1120 1345 0.621 0.742
2 1985_1207_1250 1 1207 1250 0.700 0.759
3 1985_1229_1425 1 1229 1425 0.615 0.667
4 1985_1242_1325 1 1242 1325 0.679 0.774
5 1986_1116_1430 0 1116 1430 0.742 0.434
6 1986_1250_ 1229 0 1250 1229 0.342 0.845
7 1986_1207_1437 1 1207 1437 0.567 0.123
我以前有过这个问题,我也得到了一个很好的答案。但我面临的问题是,当年份值发生变化时(在match up
列中的数据框df
中),team
列中的团队值在df2
和df3
中不断重复。因此,如果我在team_df3
和team_df2
值上合并这三个数据帧,我将无法获得所需的输出
所以请帮我做这个。该操作等于组合下图中的数据帧1、2和3。但下图第三个数据帧中的match\u up
列值变化如下:
A_515_729
.
.
.
B_767_890
.
.
.
P_390_789
将匹配列拆分,以便我们将年份和其他df ID作为单独的列:
In [23]:
df['year'] = list(map(int,(df['match_up'].str.split('_').str[0])))
df['team_df2'] = list(map(int,(df['match_up'].str.split('_').str[1])))
df['team_df3'] = list(map(int,(df['match_up'].str.split('_').str[2])))
df1['year'] = list(map(int,(df['match_up'].str.split('_').str[0])))
df2['year'] = list(map(int,(df['match_up'].str.split('_').str[0])))
df
Out[23]:
match_up result year team_df2 team_df3
0 1985_1116_1234 1 1985 1116 1234
1 1985_1120_1345 1 1985 1120 1345
2 1985_1207_1250 1 1985 1207 1250
3 1985_1229_1425 1 1985 1229 1425
4 1985_1242_1325 1 1985 1242 1325
5 1986_1116_1430 0 1986 1116 1430
6 1986_1250_1229 0 1986 1250 1229
7 1986_1207_1437 1 1986 1207 1437
现在我们可以使用year和team列合并,以避免歧义:
In [24]:
merged = df.merge(df1, left_on=['year', 'team_df2'], right_on=['year','team_df2'])
merged = merged.merge(df2, left_on=['year', 'team_df3'], right_on=['year','team_df3'])
merged
Out[24]:
match_up result year team_df2 team_df3 win_df2 win_df3
0 1985_1116_1234 1 1985 1116 1234 0.636 0.667
1 1985_1120_1345 1 1985 1120 1345 0.621 0.742
2 1985_1207_1250 1 1985 1207 1250 0.700 0.759
3 1985_1229_1425 1 1985 1229 1425 0.615 0.667
4 1985_1242_1325 1 1985 1242 1325 0.679 0.774
5 1986_1116_1430 0 1986 1116 1430 0.742 0.434
6 1986_1250_1229 0 1986 1250 1229 0.342 0.845
7 1986_1207_1437 1 1986 1207 1437 0.567 0.123
然后,您可以删除不再感兴趣的列:
In [27]:
merged.drop('year',axis=1)
Out[27]:
match_up result team_df2 team_df3 win_df2 win_df3
0 1985_1116_1234 1 1116 1234 0.636 0.667
1 1985_1120_1345 1 1120 1345 0.621 0.742
2 1985_1207_1250 1 1207 1250 0.700 0.759
3 1985_1229_1425 1 1229 1425 0.615 0.667
4 1985_1242_1325 1 1242 1325 0.679 0.774
5 1986_1116_1430 0 1116 1430 0.742 0.434
6 1986_1250_1229 0 1250 1229 0.342 0.845
7 1986_1207_1437 1 1207 1437 0.567 0.123
将年份列添加到df2和df3中可能是有意义的,这样年份就可以用作执行合并的附加列,以避免这种模糊性。您最近问了很多问题,这很好,但是我想让您知道,如果您提供python代码来创建数据帧,而不是复制和粘贴其内容,那么回答这些问题会更容易。这样可以直接处理解决方案,而不是(犹豫)先创建数据帧。@Nras-代码有30-40行。这就是为什么我没有复制粘贴它。我正在做一个项目,我一个人在做。@EdChum,但我必须再次从最后的数据框中删除年份列,对吗?如果必要,可以在后面删除,但我认为您需要它来避免这种歧义,而且有一个包含多个标识符的列是一个非常糟糕的主意。我试图实现您的解决方案。但我得到了ValueError:值的长度与索引的长度不匹配
。当我分配df1['year']=list(map(int,(df['match\u up'].str.split(''u').str[0]))
。那么在这种情况下,我应该怎么做呢?如果长度不匹配,那么你可以合并它,但我猜我代码中的df1实际上是你代码中的df2,这可能意味着你在df2中丢失了年份信息,你可以做的是通过合并它来添加年份信息,比如df1.merge(df,on='team\u df2',how='left')
好的,我正在处理。在我将其应用于我的代码后,将让您知道!!