[英]Assign values in a new column based on other columns (multiple matches with merge)
根据下面的示例,有两个数据框,我想根据两列(产品和价格)为第二个 dataframe 分配值。 但是,需要强调的是,不同的商店/卖家有相同的产品和价格。
请在下面找到一个简单的例子。
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']}
df = pd.DataFrame(df)
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 = pd.DataFrame(df2)
预期结果:
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']}
我试图在两个数据框中将数量拆分为一个单元,然后根据列值进行合并。 但是,没有按预期工作。 我的猜测是结果不正确,因为存在与不止一行匹配的条件。 因此,可能的解决方案可能是遍历具有相同详细信息的两个数据帧匹配列,并从原始 dataframe 中删除匹配的金额。
我尝试了什么:
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'])
您正在尝试合并数据框,但您的 df1 和 df2 仍然是字典。 首先将它们转换为数据帧。
import pandas as pd
df = pd.DataFrame(df)
df2 = pd.DataFrame(df2)
然后,您可以在第一个 dataframe 上删除列,并且不要忘记在第二个 dataframe 中包含要合并的列
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
让我知道这是否适合你
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.