【发布时间】:2020-03-03 05:29:39
【问题描述】:
对于可能合并先前问题/主题的内容,请提前致歉。我在各种相关文章上花费了大量时间,并且相信我迷失了最佳使用方法。问题是:
我有两个相同维度、列名和索引的 Pandas DataFrame。它们都来自单独的 SQL 查找。我有第三个 DataFrame 用作 dict,这样我就可以使用连接/合并操作来填充原始两个 DataFrame 中的每一个中的空列。一旦完成,并且两个 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
省略控制字典以节省帖子中的空间,这是我将每个帧合并到字典帧时得到的结果。 到目前为止,这里的结果是正确的(对我来说):
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
【问题讨论】:
标签: python pandas dataframe pandas-groupby