【问题标题】:concat specific rows of two pandas dataframe using data in two columns as reqs使用两列中的数据作为请求连接两个熊猫数据帧的特定行
【发布时间】:2017-10-08 08:36:10
【问题描述】:

我有两个数据框 DF1 和 DF2,其中

都有子帧“数据”和“元数据”,并且 DF1 的行数比 DF2 多很多

DF1 
     DATA            METADATA
     0 1 2 3 4 5     attr1      attr2        ..  attrN
11   1 1 1 1 1 1     000        apple
13   1 1 1 1 1 1     140        orange
19   1 1 1 1 1 1     199        pineapple
25   1 5 1 1 1 2     000        apple
..

DF2 
     DATA        METADATA
     x y z k     attr1      attr2            ..  attrK
000  2 2 2 2     000        bean
001  2 2 2 2     001        bean
002  2 2 2 2     002        bean
003  2 2 2 2     003        bean
..
199  2 2 2 2     199        bean
200  2 2 2 2     000        orange
201  2 2 2 2     001        orange
..
340  1 2 3 4     140        orange
..
500  4 3 2 1     000        apple
..
700  2 2 2 2     350        bread
..
999  5 5 5 5     199        pineapple

我想根据 DF2 中的属性将 DF2 中的列特定行连接到 DF1 中的行。

具体来说:

对于 DF1 中的每一行,我只想连接 DF2 中的行中的数据,以便 DF1.METADATA.attr1 & DF2.METADATA.attr1 和 DF1.METADATA.attr2 & DF2.METADATA.attr2 中的条目是同样,对于每一行。这里的结果是:

 DF3 (desired result)
       DATA                  METADATA
       0 1 2 3 4 5 x y z k   attr1       attr2       .. attr N
 11    1 1 1 1 1 1 4 3 2 1   000         apple
 13    1 1 1 1 1 1 1 2 3 4   140         orange
 19    1 1 1 1 1 1 5 5 5 5   199         pineapple
 25    1 5 1 1 1 2 4 3 2 1   000         apple

我已经设法通过循环来做到这一点,但是我得到了一个糟糕的运行时间并且有很多数据我需要让它运行得更快,并且应该有一个快速简单的方法来通过 pandas 来做到这一点(我认为! )

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    听起来您想在 attr1 上进行合并,例如:

    df1.merge(df2, how='left')
    

    例如(稍作调整):

    In [11]: df1
    Out[11]:
       DATA                METADATA
          0  1  2  3  4  5    attr1      attr2
    11    1  1  1  1  1  1        0       bean
    13    1  1  1  1  1  1      140     orange
    19    1  1  1  1  1  1      199  pineapple
    25    1  5  1  1  1  2        0      apple
    
    In [12]: df2
    Out[12]:
      DATA          METADATA
         x  y  z  k    attr1  attr2
    0    2  2  2  2        0   bean
    1    7  2  2  2        0  apple
    2    2  2  2  2        2   bean
    3    7  2  2  2        3   bean
    
    In [13]: df1.merge(df2, how="left")
    Out[13]:
      DATA                METADATA            DATA
         0  1  2  3  4  5    attr1      attr2    x    y    z    k
    0    1  1  1  1  1  1        0       bean  2.0  2.0  2.0  2.0
    1    1  1  1  1  1  1      140     orange  NaN  NaN  NaN  NaN
    2    1  1  1  1  1  1      199  pineapple  NaN  NaN  NaN  NaN
    3    1  5  1  1  1  2        0      apple  7.0  2.0  2.0  2.0
    

    注意:这会在共享列上合并,在本例中为 METADATA attr1 和 attr2。请参阅merge section of the docs

    【讨论】:

    • 我认为这可能有效;让我测试一下。理想情况下,我希望最终数据帧中的两个 DATA 位于一个 DATA 之下,但这是我可以自己完成的简单修复。但是,这是否适用于当我有多个我不想合并的属性时?例如,如果在您的示例中,我在 df1 和 df2 中都有多个属性,并且所有这些属性都与我要合并的内容完全无关
    猜你喜欢
    • 2015-08-15
    • 2020-01-20
    • 2020-10-13
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    相关资源
    最近更新 更多