![](/img/trans.png)
[英]Pandas dataframe apply function to column strings based on other column value
[英]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)
。 对于这种想象的情况,让我们说:
然后东面,东边的东面返回的重量是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.