【问题标题】:Assign values in a new column based on other columns (multiple matches with merge)根据其他列在新列中分配值(多个匹配与合并)
【发布时间】:2022-12-05 23:49:15
【问题描述】:

根据下面的示例,有两个数据框,我想根据两列(产品和价格)将值分配给第二个数据框。但是,需要强调的是,不同的商店/卖家有相同的产品和价格。

请在下面找到一个简单的例子。

1st df

df = {'Product':['TV', 'iPhone', 'TV'], 'Seller': ['Pankaj', 'John', 'John'] , 'Amount': [15, 10, 20], 'Price' : [2.50, 3.50, 2.5], 'Store': ['Walmart', 'Amazon', 'Amazon']}

2nd df

df2 = {'Product':['TV', 'TV', 'iPhone', 'iPhone', 'TV'], 'Amount': [10, 5, 5, 5, 20], 'Price' : [2.50, 2.5, 3.50, 3.50, 2.5], 'ID':['GLOBAL', 'FLAGSHIP', 'GREEN', 'FLAGSHIP', 'GLOBAL']}

预期结果:

df2 = {'Product':['TV', 'TV', 'iPhone', 'iPhone', 'TV'], 'Amount': [10, 5, 5, 5, 20], 'Price' : [2.50, 2.5, 3.50, 3.50, 2.5], 'ID':['GLOBAL', 'FLAGSHIP', 'GREEN', 'FLAGSHIP', 'GLOBAL'], 'Store': ['Walmart', 'Walmart', 'Amazon', 'Amazon', 'Amazon'], 'Seller': ['Pankaj', 'Pankaj', 'John', 'John', 'John']}

我试图在两个数据框中将数量拆分为一个单元,然后根据列值进行合并。但是,没有按预期工作。我的猜测是结果不正确,因为存在与不止一行匹配的条件。因此,可能的解决方案可能是循环遍历两个具有相同详细信息的匹配列的数据帧,并从原始数据帧中删除匹配的金额。

我尝试了什么:

df= df.loc[df.index.repeat(df['Amount'])].reset_index(drop=True)
df['Amount'] = 1

df2= df2.loc[df2.index.repeat(df2['Amount'])].reset_index(drop=True)
df2['Amount'] = 1

df2 = df2.merge(df, how='left', left_on=['Product', 'Price'])

【问题讨论】:

    标签: python dataframe merge


    【解决方案1】:

    您正在尝试合并数据框,但您的 df1 和 df2 仍然是字典。 首先将它们转换为数据帧。

    import pandas as pd
    
    df = pd.DataFrame(df)
    df2 = pd.DataFrame(df2)
    

    然后,您可以将列放在第一个数据框中,不要忘记在第二个数据框中包含要合并的列

    df.drop(columns=['Amount', 'Price'])
    df3 = df2.merge(df, how='left', left_on=['Product','Price'],right_on=['Product','Price'])
    df3
    
      Product  Amount_x  Price        ID  Seller  Amount_y    Store
    0      TV        10    2.5    GLOBAL  Pankaj        15  Walmart
    1      TV        10    2.5    GLOBAL    John        20   Amazon
    2      TV         5    2.5  FLAGSHIP  Pankaj        15  Walmart
    3      TV         5    2.5  FLAGSHIP    John        20   Amazon
    4  iPhone         5    3.5     GREEN    John        10   Amazon
    5  iPhone         5    3.5  FLAGSHIP    John        10   Amazon
    6      TV        20    2.5    GLOBAL  Pankaj        15  Walmart
    7      TV        20    2.5    GLOBAL    John        20   Amazon
    

    让我知道这是否适合你

    【讨论】:

      猜你喜欢
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 2021-04-17
      相关资源
      最近更新 更多