繁体   English   中英

将函数应用于pandas Dataframe,其返回值基于其他行

[英]apply a function to a pandas Dataframe whose returned value is based on other rows

我的Dataframe看起来像这样:

>>> 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
  • 南方的价值是值得的

然后东面,东边的东面返回的重量是0.3333333333333333(1/3)。 东,西,南池南的重量为0.5(1/2)。

因此,对于第一行,我们查看第一项和价格50的其他行。有两个一个是东,一个是西区。 第一行中的新数量为:3 * region_weight("east", ["east", "west"])或3 * 0.3333333333333333。

我想将相同的流程应用于整个数量列。 我不知道如何使用pandas库来解决这个问题,而不是逐行循环遍历Dataframe。

好吧,我认为这可以做你想要的:

制作区域权重字典:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM