[英]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.