Python 如何";配对;合并两个数据帧时,将行合并在一起并合并为一行?

Python 如何";配对;合并两个数据帧时,将行合并在一起并合并为一行?,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,提前就可能合并先前的问题/主题道歉。我花了很多时间在各种相关的文章上,并且相信我正在迷失在最佳的使用方法中。问题是: 我有两个相同维度、列名和索引的数据帧。它们都是从单独的SQL查找中派生出来的。我有第三个数据帧作为dict,这样我可以使用join/merge操作来填充原始两个数据帧中的每一个的空列。一旦完成,并且两个数据帧中的列都已满,我想将它们缝合在一起,以便将两个数据帧中的对应条目合并到一个统一数据帧中的一行,而不是每个数据帧中的一行。显然,列命名冲突是问题的一部分。以下是一份声明:

提前就可能合并先前的问题/主题道歉。我花了很多时间在各种相关的文章上,并且相信我正在迷失在最佳的使用方法中。问题是:

我有两个相同维度、列名和索引的数据帧。它们都是从单独的SQL查找中派生出来的。我有第三个数据帧作为dict,这样我可以使用join/merge操作来填充原始两个数据帧中的每一个的空列。一旦完成,并且两个数据帧中的列都已满,我想将它们缝合在一起,以便将两个数据帧中的对应条目合并到一个统一数据帧中的一行,而不是每个数据帧中的一行。显然,列命名冲突是问题的一部分。以下是一份声明:

    frame1
Out[87]: 
   matchupid   primary    geo
0      27812  student1   east
1      91876  student3   east
2      65019  student5   west
3      21632  student7  south
frame2
Out[88]: 
   matchupid   primary      geo
0      27812  student2     west
1      91876  student4  central
2      65019  student6    north
3      21632  student8     east
为了节省文章中的空间,不使用控件dict,下面是我在将每个帧合并到字典帧时得到的结果到目前为止,这里的结果是正确的:

a1 = frame1.merge(dictFrame, on="primary")
a1
Out[70]: 
   matchupid   primary    geo  matchup q1_res q2_res
0      27812  student1   east    27812   fail   41.2
1      91876  student3   east    91876   78.2   pass
2      65019  student5   west    65019  defer    107
3      21632  student7  south    21632  210.4   fail
a2 = frame2.merge(dictFrame, on="primary")
a2
Out[72]: 
   matchupid   primary      geo  matchup q1_res q2_res
0      27812  student2     west    27812  defer   fail
1      91876  student4  central    91876  104.2  defer
2      65019  student6    north    65019   92.2   91.4
3      21632  student8     east    21632   pass   pass
a3 = pd.concat([a1, a2])
a3
Out[75]: 
   matchupid   primary      geo  matchup q1_res q2_res
0      27812  student1     east    27812   fail   41.2
1      91876  student3     east    91876   78.2   pass
2      65019  student5     west    65019  defer    107
3      21632  student7    south    21632  210.4   fail
0      27812  student2     west    27812  defer   fail
1      91876  student4  central    91876  104.2  defer
2      65019  student6    north    65019   92.2   91.4
3      21632  student8     east    21632   pass   pass
Out[97]: 
   matchupid   primary q1_res q2_res secondary secondary_q1res secondary_q2res
0      27812  student1   fail   41.2      student2        defer         fail
1      91876  student3   78.2   pass      student4        104.2         defer
2      65019  student5  defer    107      student6        92.2          91.4
3      21632  student7  210.4   fail      student8        pass          pass
现在,所需的状态看起来像这样(有点做作,因为我实际上不知道如何做:))这未实现-这是期望的结果:

a1 = frame1.merge(dictFrame, on="primary")
a1
Out[70]: 
   matchupid   primary    geo  matchup q1_res q2_res
0      27812  student1   east    27812   fail   41.2
1      91876  student3   east    91876   78.2   pass
2      65019  student5   west    65019  defer    107
3      21632  student7  south    21632  210.4   fail
a2 = frame2.merge(dictFrame, on="primary")
a2
Out[72]: 
   matchupid   primary      geo  matchup q1_res q2_res
0      27812  student2     west    27812  defer   fail
1      91876  student4  central    91876  104.2  defer
2      65019  student6    north    65019   92.2   91.4
3      21632  student8     east    21632   pass   pass
a3 = pd.concat([a1, a2])
a3
Out[75]: 
   matchupid   primary      geo  matchup q1_res q2_res
0      27812  student1     east    27812   fail   41.2
1      91876  student3     east    91876   78.2   pass
2      65019  student5     west    65019  defer    107
3      21632  student7    south    21632  210.4   fail
0      27812  student2     west    27812  defer   fail
1      91876  student4  central    91876  104.2  defer
2      65019  student6    north    65019   92.2   91.4
3      21632  student8     east    21632   pass   pass
Out[97]: 
   matchupid   primary q1_res q2_res secondary secondary_q1res secondary_q2res
0      27812  student1   fail   41.2      student2        defer         fail
1      91876  student3   78.2   pass      student4        104.2         defer
2      65019  student5  defer    107      student6        92.2          91.4
3      21632  student7  210.4   fail      student8        pass          pass
我尝试了几种不同的方法,我很好奇,如果索引和匹配IP都是相同的,是否会带来一些优势。我想也许在matchupid上使用groupby可以让我保持成对工作。如果这有效,剩下的任务是1/将两行变成一行,2/将它们添加到新的(?)数据帧,3/更改列名。有人介意建议一种方法或我丢失的链接吗?提前谢谢

grouped = a3.groupby('matchupid')
grouped.get_group(21632)
Out[109]: 
   matchupid   primary q1_res q2_res
3      21632  student7  210.4   fail
3      21632  student8   pass   pass

看起来这是pd.concat(axis=1)的作业,是一种“水平”连接:

# Create a temporary DataFrame from a2 with correct column names
temp = a2.rename(columns={'primary': 'secondary', 
                          'q1_res':'secondary_q1res',
                          'q2_res':'secondary_q2res'})
temp = temp.drop(columns=['matchup', 'geo'])

# Horizontally concat with relevant columns of a1
a3 = pd.concat([a1.drop(columns=['matchup', 'geo']), temp], axis=1)