代码之家  ›  专栏  ›  技术社区  ›  Ahamed Moosa

基于另一个数据帧的列值筛选数据帧

  •  1
  • Ahamed Moosa  · 技术社区  · 6 年前

    我有两个数据帧

    DF1

    Company           SKU   Sales
    Walmart           A     100
    Total             A     200
    Walmart           B     200
    Total             B     300
    Walmart           C     400
    Walmart           D     500
    

    DF2

     Company             SKU   Sales
     Walmart             A     400
     Total               B     300
     Walmart             C     900
     Walmart             F     400
     Total               G     500
    

    我想要一个结果数据帧(df2),它只有df1和df2中匹配sku的记录

    DF2

    Company       SKU   Sales 
    Walmart       A     400
    Total         B     300
    Walmart       C     900
    

    我只想要df2中df1的唯一值(company+sku)

    有什么好的解决办法来实现这个目标吗?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Anton vBR    6 年前

    更新

    你可以用一个简单的面具:

    m = df2.SKU.isin(df1.SKU)
    df2 = df2[m]
    

    您正在寻找内部连接。试试这个:

    df3 = df1.merge(df2, on=['SKU','Sales'], how='inner')
    
    #  SKU  Sales
    #0   A    100
    #1   B    200
    #2   C    300
    

    或者这个:

    df3 = df1.merge(df2, on='SKU', how='inner')
    
    #  SKU  Sales_x  Sales_y
    #0   A      100      100
    #1   B      200      200
    #2   C      300      300
    
        2
  •  2
  •   Ram    6 年前

    解决方案1:

    # First identify the common SKU's    
    temp = list(set(list(df1.SKU)).intersection(set(list(df2.SKU))))
    
    # Filter df2 using the list of common SKU's
    df3 = df2[df2.SKU.isin(temp)]
    print(df3)
    
       SKU  Sales
    0   A   400
    1   B   300
    2   C   900
    

    解决方案2:单线解决方案

    df3 = df2[df2.SKU.isin(list(df1.SKU))]
    

    编辑1:更新问题的解决方案(不是最佳的解决方法,而是回答您的问题)

    # reading data for df1
    df1= pd.read_clipboard(sep='\\s+')
    df1
        Company SKU Sales
    0   Walmart A   100
    1   Total   A   200
    2   Walmart B   200
    3   Total   B   300
    4   Walmart C   400
    5   Walmart D   500
    
    # reading data for df2
    df2= pd.read_clipboard(sep='\\s+')
    df2
    Company SKU Sales
    0   Walmart A   400
    1   Total   B   300
    2   Walmart C   900
    3   Walmart F   400
    4   Total   G   500
    
    # Using intersect and zip to create a list of tuples matching in the data frames
    temp = list(set(list(zip(df1.Company,df1.SKU))).intersection(set(list(zip(df2.Company,df2.SKU)))))
    temp
    [('Walmart', 'A'), ('Walmart', 'C'), ('Total', 'B')]
    
    # Creating a helper variable in df2 to lookup in the temp list
    df2["temp"] = list(zip(df2.Company,df2.SKU))
    df2= df2[df2["temp"].isin(temp)]
    del(df2["temp"])
    df2
        Company SKU Sales
    0   Walmart A   400
    1   Total   B   300
    2   Walmart C   900
    

    欢迎提出改进此代码的建议

        3
  •  1
  •   jpp    6 年前

    一种方法是对齐索引,然后使用掩码。

    # align indices
    df1 = df1.set_index(['Company',  'SKU'])
    df2 = df2.set_index(['Company',  'SKU'])
    
    # calculate & apply mask
    df2 = df2[df2.index.isin(df1.index)].reset_index()
    

    不需要重置索引,但需要提升 Company SKU 到列。