【问题标题】:apply a function to a pandas Dataframe whose returned value is based on other rows将函数应用于返回值基于其他行的 pandas Dataframe
【发布时间】:2013-01-20 21:55:59
【问题描述】:

我有一个如下所示的数据框:

>>> import pandas
>>> df = pandas.DataFrame({'region' : ['east', 'west', 'south', 'west',
...  'east', 'west', 'east', 'west'],
...  'item' : ['one', 'one', 'two', 'three',
...         'two', 'two', 'one', 'three'],
...         'quantity' : [3,3,4,5,12,14,3,8], "price" : [50,50,12,35,10,10,12,12]})
>>> df
    item  price  quantity region
0    one     50         3   east
1    one     50         3   west
2    two     12         4  south
3  three     35         5   west
4    two     10        12   east
5    two     10        14   west
6    one     12         3   east
7  three     12         8   west

我想要做的是修改数量列中的值。每个新的数量值都是根据该行的项目和价格组合存在的不同区域的数量来计算的。更具体地说,我想将每个数量乘以我编写的函数返回的区域权重,该函数采用区域和组成池的其他区域的列表:

region_weight(region, list_of_regions)。对于这种想象的情况,让我们说:

  • 区域东值1
  • 区域西值 2
  • 南值值 3

那么在东、西池中东的返回权重为 0.3333333333333333(1/3)。池东、西、南中南的权重为0.5(1/2)。

所以对于第一行,我们看看还有哪些其他行是商品 1 和价格 50。有 2 行与东部和西部地区。第一行中的新数量为:3 * region_weight("east", ["east", "west"]) 或 3 * 0.3333333333333333。

我想对整个数量列应用相同的过程。除了逐行循环遍历 Dataframe 之外,我不知道如何使用 pandas 库来解决这个问题。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    好的,我认为这可以满足您的要求:

    制作你的区域权重字典:

    In [1]: weights = {'east':1,'west':2,'south':3}
    

    以下函数将 Series 中的值映射到权重字典中的值。 x 是区域的行值,w 是映射到权重字典后的区域序列。

    In [2]: def f(x):
       ...:     w = x.map(weights)
       ...:     return w / w.sum().astype(float)
    

    在这里,我们将['item','price'] 分组并应用上面的功能。输出是项目和价格的唯一组合的一系列相对权重。

    In [3]: df.groupby(['item','price']).region.apply(f)
    Out[3]:
    0    0.333333
    1    0.666667
    2    1.000000
    3    1.000000
    4    0.333333
    5    0.666667
    6    1.000000
    7    1.000000
    

    最后,您可以将df.quantity 乘以上述系列来计算您的体重调整数量。

    In [4]: df['wt_quant'] = df.groupby(['item','price']).region.apply(f) * df.quantity
    
    In [5]: df
    Out[5]:
        item  price  quantity region  wt_quant
    0    one     50         3   east  1.000000
    1    one     50         3   west  2.000000
    2    two     12         4  south  4.000000
    3  three     35         5   west  5.000000
    4    two     10        12   east  4.000000
    5    two     10        14   west  9.333333
    6    one     12         3   east  3.000000
    7  three     12         8   west  8.000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-14
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2021-12-30
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多