【问题标题】:How to "pair" rows together and consolidate them into one when merging two pandas DataFrames?合并两个熊猫数据框时,如何将行“配对”并将它们合并为一个?
【发布时间】: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


    【解决方案1】:

    看起来这是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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2017-06-11
      • 2016-01-01
      • 2020-04-05
      • 2018-12-18
      相关资源
      最近更新 更多