【问题标题】:merge from one dataframe values with one dataframe columns从一个数据框值与一个数据框列合并
【发布时间】:2019-07-21 13:08:01
【问题描述】:

我在这里有一个困难。我的目标是为一家商店创建一个销售列表,其中一个数据框按产品列出价格,另一个数据框按产品和数量列出所有销售(一段时间)

DataFrame 1:价格

prices = pd.DataFrame({'qty_from' : ('0','10','20'), 'qty_to' : ('9','19','29'), 'product_A' :(50,30,10),'product_B' :(24,14,12),'product_C' :(70,50,18)})

DataFrame 2:销售额

sales = pd.DataFrame({'product' : ('product_b','product_b','product_a',product_c,product_b), 'qty' : ('4','12','21','41','7')})

我想在 'sales' DataFrame 中逐行获取营业额,以及另一列,如 'TurnOver'

我用过

pd.merge_asof(sales, prices, left_on='qty', right_on='qty_from', direction='backward') 

它给了我销售数量的正确价格,但是如何获得与一种产品相关的好价格? 如何与“销售”数据框中的值(如“product_b”)与数据框价格中的列名称(此处为“product_b”)合并,然后应用计算来获得营业额?

感谢您的帮助,

埃里克

【问题讨论】:

  • 你能不能展示一个你有什么和你想要什么的样本,这样会更容易理解
  • 法式。谢谢你的兴趣。 Ben T 在下面找到了解决方案。

标签: python pandas merge


【解决方案1】:

如果我理解正确,您可以修改数据框价格以便能够使用merge_asof 中的参数by,使用stack

#modify price
prices_stack = (prices.set_index(['qty_from','qty_to']).stack() # then products become as a column
                     .reset_index(name='price').rename(columns={'level_2':'product'}))

# uniform the case
sales['product'] = sales['product'].str.lower()
prices_stack['product'] = prices_stack['product'].str.lower()
# this is necessary with your data here as not int
sales.qty = sales.qty.astype(int)
prices_stack.qty_from = prices_stack.qty_from.astype(int)

#now you can merge_asof adding by parameter
sales_prices = (pd.merge_asof( sales.sort_values('qty'), prices_stack, 
                               left_on='qty', right_on='qty_from', 
                               by = 'product', #first merge on the column product
                               direction='backward')
                  .drop(['qty_from','qty_to'], axis=1)) #not necessary columns

print (sales_prices)
     product  qty  price
0  product_b    4     24
1  product_b    7     24
2  product_b   12     14
3  product_a   21     10
4  product_c   41     18

【讨论】:

  • Ben T 感谢您的回复,这正是我所期待的。堆栈函数在这里很“神奇”,让我有机会将列名转换为索引,然后转换为每个价格的值。感谢您的及时回复。对此,我真的非常感激。埃里克
  • @boskey50 很高兴它有所帮助,你从中学到了一些东西,这就是这个社区的意义所在:)
猜你喜欢
  • 2014-01-03
  • 2019-03-12
  • 2021-04-11
  • 2017-10-21
  • 1970-01-01
  • 2018-01-03
  • 2021-06-29
  • 2016-01-20
  • 1970-01-01
相关资源
最近更新 更多