【问题标题】:Merging two DataFrame with different number of rows合并两个不同行数的DataFrame
【发布时间】:2017-07-28 15:21:20
【问题描述】:

如何合并下面两个行数不同但在 Pandas 中有一个公共列的 DataFrame?

数据帧1:

CName   PName   Col1    Col2
A1      XX1     34      22
A2      XX2     23      44
A1      XX3     11      12
A2      XX4     23      43
A1      XX5     42      76
A3      XX6     15      56
A4      XX7     33      45
A5      XX8     223     87
A5      XX9     12      56
A5      XX10    87      34
A5      XX11    6       23
A4      XX12    55      33

数据帧2:

CName   read    unread
A1      12      43
A2      24      78
A3      1       65
A4      2       16
A5      5       6

因此生成的 DataFrame 必须如下:

CName   PName   Col1    Col2    SumOfReadAndUnRead
A1      XX1     34      22      55
A2      XX2     23      44      102
A1      XX3     11      12      55
A2      XX4     23      43      102
A1      XX5     42      76      55
A3      XX6     15      56      66
A4      XX7     33      45      18
A5      XX8     223     87      11
A5      XX9     12      56      11
A5      XX10    87      34      11
A5      XX11    6       23      11
A4      XX12    55      33      18

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    df2中的已读和未读列求和,然后加入df1

    >>> df1.join(df2.set_index('CName').sum(axis=1).to_frame('SumOfReadAndUnRead'), on='CName')
       CName PName  Col1  Col2  SumOfReadAndUnRead
    0     A1   XX1    34    22   55
    1     A2   XX2    23    44  102
    2     A1   XX3    11    12   55
    3     A2   XX4    23    43  102
    4     A1   XX5    42    76   55
    5     A3   XX6    15    56   66
    6     A4   XX7    33    45   18
    7     A5   XX8   223    87   11
    8     A5   XX9    12    56   11
    9     A5  XX10    87    34   11
    10    A5  XX11     6    23   11
    11    A4  XX12    55    33   18
    

    【讨论】:

      【解决方案2】:

      看起来'CName' 在第二个数据帧中是唯一的。我会使用map。它应该更快。

      df1.assign(
          SumOfReadAndUnRead=df1.CName.map(df2.set_index('CName').sum(1))
      )
      
         CName PName  Col1  Col2  SumOfReadAndUnRead
      0     A1   XX1    34    22                  55
      1     A2   XX2    23    44                 102
      2     A1   XX3    11    12                  55
      3     A2   XX4    23    43                 102
      4     A1   XX5    42    76                  55
      5     A3   XX6    15    56                  66
      6     A4   XX7    33    45                  18
      7     A5   XX8   223    87                  11
      8     A5   XX9    12    56                  11
      9     A5  XX10    87    34                  11
      10    A5  XX11     6    23                  11
      11    A4  XX12    55    33                  18
      

      【讨论】:

      • @Alexander map 是恒定时间查找。 join 不是。 map 将不起作用,除非 CNamedf2 中是唯一的。 join 可以任意使用。
      猜你喜欢
      • 2019-05-22
      • 2016-10-24
      • 2018-09-16
      • 2021-07-30
      • 2021-08-15
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      相关资源
      最近更新 更多