![](/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.