【问题标题】:How to map multiple datasets based on the same row values of one column?如何根据一列的相同行值映射多个数据集?
【发布时间】:2022-11-16 00:09:29
【问题描述】:

我有三个数据集,

df1
   name              A         B         C         D  
0  Jeffrey Ray       0.171130  0.307791 -0.031378  0.366607
1  Crystal Roberts   0.429614  1.674201  0.176098 -1.289623
2  Paul Choute       0.396332 0.879003  1.889926  0.745100
3  Amy Clements      1.452253  0.724694 -0.830645 -0.342138
4  Stanley Coston    -0.135439 -0.293293  0.684627  0.538049

df2
   name              A         B         C         D  
0  Jeffrey Ray       0.173430  0.399791 -0.012278  0.88897
1  Sara Flicker      0.635744  1.699001  0.176098 -1.11113
2  Jack Sether      0.323333 0.879003  1.889926  0.983640
3  Amy Clements      1.452253  0.784734 -0.673695 -0.342138
4  Stanley Coston    -0.143222 -0.293293  0.683647  0.638479

df3
   name              A         B         C         D  
0  Jeffrey Ray       0.638273  0.687777  0.766666  0.900032
1  Sara Flicker      0.635744  1.699001  0.176098 -1.11113
2  Samantha Runyon   0.323333 -0.879003  1.889926  -0.683640
3  Amy Clements      -1.452253  0.784734 -0.673695 -0.342138
4  Stanley Coston    -0.143222 -0.282222  0.683647  -0.638479

我想在每个名称中映射名称并获得总和 D:

Jeffrey Ray  0.366607+0.88897+0.900032
Amy Clements -0.342138+(-0.342138)+(-0.342138)
Stanley Coston 0.538049+0.638479-0.638479

我试过 pd.merge:

pd.merge(df1, df2, on='name', how='inner').sum().reset_index()

但输出不是我预期的。关于我应该如何改变它的任何建议? 另一个问题是它每次只能合并两个数据集,有没有一种有效的方法可以在没有 for 循环的情况下同时映射多个数据集?

谢谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    怎么样:

    dfs = pd.concat([df1,df2,df3])
    out = dfs.groupby('name')['D'].sum()[dfs['name'].value_counts()==3]
    

    输出:

     name
    Amy Clements     -1.026414
    Jeffrey Ray       2.155609
    Stanley Coston    0.538049
    Name: D, dtype: float64
    

    【讨论】:

    • @Geinkehdsk 和 .value_counts,我们正在计算每个名称在 dfs 中出现的次数,并且由于重叠的名称必须出现 3 次,因此我们对其进行过滤。
    【解决方案2】:

    您只能concat D 列,使用名称为index。使用dropna 删除不完整的数据集,使用sum

    dfs = [df1, df2, df3]
    (pd.concat([d.set_index('name')['D'] for d in dfs], axis=1)
       .dropna()
       .sum(1)
    )
    

    输出:

    name
    Jeffrey Ray       2.155609
    Amy Clements     -1.026414
    Stanley Coston    0.538049
    

    【讨论】:

      【解决方案3】:

      使用来自functoolspd.mergereduce

      from functools import reduce
      
      out = reduce(lambda dfL, dfR: dfL.set_index('name').add(dfR.set_index('name')).reset_index(), [df1, df2, df3]) 
                  .dropna().set_index('name')['D']
      print(out)
      
      # Output:
      name
      Amy Clements     -1.026414
      Jeffrey Ray       2.155609
      Stanley Coston    0.538049
      dtype: float64
      

      【讨论】:

      • @mozway。感谢您的编辑。
      【解决方案4】:
      df1=df1.set_index('name')
      df2=df2.set_index('name')
      df3=df3.set_index('name')
      
      idx1=df1.index.intersection(df2.index)
          .intersection(df3.index)
      
      (df1.loc[idx1]+df2.loc[idx1]+df3.loc[idx1]).reset_index()
      
                  name         A         B         C         D
      0     Jeffrey-Ray  0.982833  1.395359  0.723010  2.155609
      1    Amy-Clements  1.452253  2.294162 -2.178035 -1.026414
      2  Stanley-Coston -0.421883 -0.868808  2.051921  0.538049
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-15
        • 2017-09-21
        • 1970-01-01
        • 2019-07-18
        • 1970-01-01
        • 2021-07-04
        • 2022-11-24
        • 2023-02-03
        相关资源
        最近更新 更多