Python 按数字组合数据帧

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

我有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   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')
好的,我正在处理。在我将其应用于我的代码后,将让您知道!!