【问题标题】:Filter dataframe by line row按行过滤数据框
【发布时间】:2018-08-13 17:39:22
【问题描述】:

您好,我是 Python 初学者,需要一些帮助。我正在尝试针对另一个数据框过滤一个数据框。

Df1

 date          emp#   sku     transaction#   
 2017-01-01    10     200     399              
 2017-01-01    10     201     399             
 2017-01-01    10     202     399             
 2017-01-01    11     203     399             
 2017-01-01    11     200     399            

Df2

 date          emp#   sku     transaction#
 2017-01-01    10     200     301
 2017-01-01    11     200     301

想要的 Df1

 date          emp#   sku     transaction#
 2017-01-01    10     200     399
 2017-01-01    11     200     399

我知道这可以与内部联接(一个 emp# 和 sku)一起使用,但我会有错误的列,我该如何作为过滤器执行此操作?

【问题讨论】:

    标签: python pandas filter merge


    【解决方案1】:

    使用mergeon 参数:

    Df1.merge(Df2, on=['date','emp#','sku'], suffixes=('','_y'))\
       .drop('transaction#_y', axis=1)
    

    输出:

             date  emp#  sku  transaction#
    0  2017-01-01    10  200           399
    1  2017-01-01    11  200           399
    

    【讨论】:

      【解决方案2】:

      这是没有pd.merge 的一种方法。这种方法的好处是您不必摆弄列名。

      df2 = df2.set_index(['emp#', 'sku'])
      df2['transaction#'] = df1.set_index(['emp#', 'sku'])['transaction#']
      df2 = df2.reset_index()
      
      #    emp#  sku        date  transaction#
      # 0    10  200  2017-01-01           399
      # 1    11  200  2017-01-01           399
      

      【讨论】:

        【解决方案3】:

        您可以通过将所需列转换为字典并将方向设置为list 来对df2 进行过滤,然后使用isin 检入存在的值。最后,取每一行的min 以确保满足两个条件,即

        1. False + False = False
        2. False + True = False
        3. True + False = False
        4. True + True = True

        cols = ['emp#','sku']
        df1[df1[cols].isin(df2[cols].to_dict(orient='list')).min(1)]
        
                 date  emp#  sku  transaction#
        0  2017-01-01    10  200           399
        4  2017-01-01    11  200           399
        

        【讨论】:

          【解决方案4】:

          您需要一个看起来像这样的内部联接:保留仅在两者中的行:

          df1.join(df2, how='inner')
          

          【讨论】:

          • 可能会在加入之前从 df2 中删除您不想要的列;这将防止使用错误的“sku”。
          猜你喜欢
          • 2017-11-12
          • 1970-01-01
          • 1970-01-01
          • 2016-01-21
          • 2018-03-08
          • 2019-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多