对于之前的问题/主题可能会合并,请提前道歉。我花了很多时间在各种相关的文章上,相信我已经迷失了最佳使用方法。问题是:
我有两个相同维度、列名和索引的Pandas DataFrames。它们都是从单独的SQL查找中派生出来的。我有第三个DataFrame,它充当dict,这样我就可以使用联接/合并操作来填充原始两个DataFrame中的每一个的空列。一旦完成,并且两个DataFrame中的列都已满,我想将它们缝合在一起,这样两个数据帧中的相应条目就可以组合到一个统一DataFrame中一行,而不是每个数据帧中一行。显然,列命名会发生冲突,这也是问题的一部分。这里有一个表示:
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,以下是我将每个框架合并到dictionary框架时得到的结果到目前为止,这里的结果(对我来说(是正确的:
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是否相同这一事实是否会带来一些优势。我想也许在火柴盒上使用groupby可以让我在需要保留的双人组中工作。如果这样做有效,剩下的任务是1/将两行合并为一行,2/将它们添加到新的(?(DataFrame中,以及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)