簡體   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