代码之家  ›  专栏  ›  技术社区  ›  swifty

熊猫-合并和比较两个数据帧(一个唯一列)

  •  2
  • swifty  · 技术社区  · 6 年前

    我知道这是一个常见的问题,但熊猫身上有太多的变化,我找不到解决我的问题的方法。

    我有两个数据帧-一个用于 today 一个是为了 yesterday 并希望创建两个新的df,将两者都用作输入。

    基于我的唯一列-两个df的比较可以有三个输出之一。

    1. 唯一键在两者中 今天 昨天
    2. 唯一键在 今天 但不是 昨天
    3. 唯一键不是 今天 但是在 昨天

    第一个df我想合并df,使其输出1&2,值在 昨天 优先并添加 昨天 .

    第二个输出我只想输出3。

    使用一些示例:

    今天

    index c1 c2 unique
    1     x  y  14A
    2     x  y  15A
    4     x  y  17A
    5     x  y  18A
    6     x  y  19A
    

    昨天

    index c1 c2 unique c3
    1     a  b  14A    z
    2     a  b  15A    z
    3     a  b  16A    z
    4     a  b  17A    z
    

    输出1(1&2)

    index c1 c2 unique c3
    1     a  b  14A    z
    2     a  b  15A    z
    4     a  b  17A    z
    5     x  y  18A
    6     x  y  19A
    

    输出2(3)

    index c1 c2 unique c3
    3     a  b  16A    z
    

    一些额外的事情:

    • 我一直想用 pd.merge 对于1,我真的不想 _x _y 合并时重复列。
    • 我试过 yest[~yest['UniqueKey'].isin(today['UniqueKey'])] 对于3,我认为它有效吗?

    任何帮助都非常感谢。

    谢谢。

    3 回复  |  直到 6 年前
        1
  •  2
  •   msr_003    6 年前

    我的第一需求解决方案(输出1和输出2)

    case1 = yesterday[yesterday['unique'].isin(today['unique'])] 
    
    case2 = today[~today['unique'].isin(yesterday['unique'])]
    
    output_1_2 = case1.append(case2, ignore_index = True)
    output_1_2.replace(np.nan, "", regex = True) # to replace NaN
    

    对于第二个需求(输出3),您的方法是有效的。

        2
  •  2
  •   Debashis Sahoo    6 年前

    对于输出3,您可以尝试:

    DataFrame.join(other_Dataframe, how = 'right')
    

    您可以: Pandas Documentation

        3
  •  1
  •   Haleemur Ali    6 年前

    输出1(1&2)可通过以下方式获得: pandas.DataFrame.combine_first

    如果尚未完成,请设置 unique 列作为数据帧的索引

    today = today.set_index('unique')
    yesterday = yesterday.set_index('unique')
    

    然后,

    yesterday[yesterday.index.isin(today.index)].combine_first(today).reset_index()
      unique c1 c2   c3  index
    0    14A  a  b    z    1.0
    1    15A  a  b    z    2.0
    2    17A  a  b    z    4.0
    3    18A  x  y  NaN    5.0
    4    19A  x  y  NaN    6.0
    

    输出2(3)可通过使用两个指标的设定差获得。 .loc 或者更好的是使用否定的 isin &布尔索引(amp;B)

    yesterday[~yesterday.index.isin(today.index)]
    # or: yesterday.loc[list(set(yesterday.index) - set(today.index))]
    # both produce the following output:
      unique  index c1 c2 c3
    0    16A      3  a  b  z