簡體   English   中英

將列添加到 pandas dataframe 中,列中的值除以基於另一列的組的列的最大值?

[英]Add column to pandas dataframe with values in a column divided by max of column based on group from another column?

import numpy as np
import pandas as pd 
drinks = pd.read_csv('https://raw.githubusercontent.com/justmarkham/pandas-videos/master/data/drinks.csv') 
drinks.head(3) 
國家 beer_servings 大陸
0 阿富汗 0 亞洲
1 阿爾巴尼亞 89 歐洲
2 阿爾及利亞 25 非洲
drinks.shape()
(193, 6) 
drinks.groupby('continent')['beer_servings'].max() 

continent
Africa           376
Asia             247
Europe           361
North America    285
Oceania          306
South America    333
Name: beer_servings, dtype: int64

我想要做的是獲取 beer_servings 列,對於每個國家/地區,查找它所在的大陸,查找該特定大陸的 beer_servings 列的最大值,然后將 beer_servings 條目除以該列的最大值(但僅適用於該國家恰好在哪個大陸),並且 append 是我原來的 dataframe 的新列,其中包含這些“標准化”值。 我怎樣才能做到這一點? 而且,你能解釋一下代碼嗎? 在 Pandas 中有什么好的慣用方法?

謝謝!

您可以按照您的說明編寫代碼。 首先,您可以創建一個字典,其中包含大陸名稱作為鍵,其中包含每個大陸的最大啤酒份量值。 然后為每一row["beer_servings"]row["continent"]應用 dict.get function 如下:

import numpy as np
import pandas as pd

if __name__ == '__main__':
    pd.options.display.max_columns = None
    pd.options.display.max_rows = None
    pd.options.display.width = None
    drinks = pd.read_csv("https://raw.githubusercontent.com/justmarkham/pandas-videos/master/data/drinks.csv")
    drink_max_dict = drinks.groupby("continent")["beer_servings"].max().to_dict()
    print(f"[main] max of drink: {drink_max_dict}")
    drinks["norm_beer_servings"] = drinks.apply(lambda row: row["beer_servings"] / drink_max_dict.get(row["continent"], 0), axis=1)
    print(drinks.head(3))

結果:

[main] max_drink: {'Africa': 376, 'Asia': 247, 'Europe': 361, 'North America': 285, 'Oceania': 306, 'South America': 333}
       country  beer_servings  spirit_servings  wine_servings  total_litres_of_pure_alcohol continent  norm_beer_servings
0  Afghanistan              0                0              0                           0.0      Asia            0.000000
1      Albania             89              132             54                           4.9    Europe            0.246537
2      Algeria             25                0             14                           0.7    Africa            0.066489

您有使用 groupby 的正確方法。 但是, groupby 每組只會給你一行。 為確保您獲得相同長度的 pd.Series,您可以使用transform

這樣,您就可以計算'normalized'值。

這是 output 的完整代碼和示例行:

import numpy as np
import pandas as pd 
drinks = pd.read_csv('abc.txt')  #downloaded to my local copy
drinks['max_serving'] = drinks.groupby('continent')['beer_servings'].transform('max') 
drinks['normalized'] = drinks['beer_servings']/drinks['max_serving']
print (drinks[['country','beer_servings','continent','max_serving','normalized']].head(20))

Output 這將是:

              country  beer_servings      continent  max_serving  normalized
0         Afghanistan              0           Asia          247    0.000000
1             Albania             89         Europe          361    0.246537
2             Algeria             25         Africa          376    0.066489
3             Andorra            245         Europe          361    0.678670
4              Angola            217         Africa          376    0.577128
5   Antigua & Barbuda            102  North America          285    0.357895
6           Argentina            193  South America          333    0.579580
7             Armenia             21         Europe          361    0.058172
8           Australia            261        Oceania          306    0.852941
9             Austria            279         Europe          361    0.772853
10         Azerbaijan             21         Europe          361    0.058172
11            Bahamas            122  North America          285    0.428070
12            Bahrain             42           Asia          247    0.170040
13         Bangladesh              0           Asia          247    0.000000
14           Barbados            143  North America          285    0.501754
15            Belarus            142         Europe          361    0.393352
16            Belgium            295         Europe          361    0.817175
17             Belize            263  North America          285    0.922807
18              Benin             34         Africa          376    0.090426
19             Bhutan             23           Asia          247    0.093117

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM