#pandas
Вопрос:
У меня есть два фрейма данных: один, который содержит данные о ВВП стран:
import pandas as pd
data = {'year': [2000, 2001, 2002, 2000, 2001, 2002, 2000, 2001, 2002, 2000, 2001, 2002],
'country': ['France', 'France', 'France', 'Germany', 'Germany', 'Germany', 'US', 'US', 'US', "Canada", "Canada","Canada"],
'GDP': [100, 150, 165, 300, 315, 318, 700, 789, 854, 320,313, 324]
}
df1 = pd.DataFrame(data)
df1
year country GDP
0 2000 France 100
1 2001 France 150
2 2002 France 165
3 2000 Germany 300
4 2001 Germany 315
5 2002 Germany 318
6 2000 US 700
7 2001 US 789
8 2002 US 854
9 2000 Canada 320
10 2001 Canada 313
11 2002 Canada 324
Другой, у которого есть данные об их членстве в международных организациях. Если страна является членом организации, в определенном году она получает «1». В противном случае он получает «0».
data = {'year': [2000, 2001, 2002, 2000, 2001, 2002],
'ioname': ['EU', 'EU', 'EU', 'NAFTA', 'NAFTA', 'NAFTA'],
'France': [1,1,1,0,0,0],
'Germany': [1,1,1,0,0,0],
'US': [0,0,0,1,1,1],
'Canada': [0,0,0,1,1,1],
}
df2 = pd.DataFrame(data)
df2
year ioname France Germany US Canada
0 2000 EU 1 1 0 0
1 2001 EU 1 1 0 0
2 2002 EU 1 1 0 0
3 2000 NAFTA 0 0 1 1
4 2001 NAFTA 0 0 1 1
5 2002 NAFTA 0 0 1 1
Я хочу рассчитать средний ВВП для членов каждой организации. Например, для ЕС мы должны использовать ценности только Германии и Франции. Это должно быть окончательным результатом:
data = {'year': [2000, 2001, 2002, 2000, 2001, 2002],
'ioname': ['EU', 'EU', 'EU', 'NAFTA', 'NAFTA', 'NAFTA'],
'France': [1,1,1,0,0,0],
'Germany': [1,1,1,0,0,0],
'US': [0,0,0,1,1,1],
'Canada': [0,0,0,1,1,1],
'mean_gdp': [200, 232.5, 241.5, 510, 551, 589]
}
df3 = pd.DataFrame(data)
df3
year ioname France Germany US Canada mean_gdp
0 2000 EU 1 1 0 0 200.0
1 2001 EU 1 1 0 0 232.5
2 2002 EU 1 1 0 0 241.5
3 2000 NAFTA 0 0 1 1 510.0
4 2001 NAFTA 0 0 1 1 551.0
5 2002 NAFTA 0 0 1 1 589.0
Как я могу это сделать?
Ответ №1:
Используйте DataFrame.pivot
для возможных множественных значений в df2
с преобразовать оба столбца в MultiIndex
, заменить 0
на NaN
s, чтобы можно было создать mean
, последний добавить новый столбец с помощью DataFrame.join
:
df = df1.pivot('year','country','GDP')
s = df2.set_index(['year','ioname']).mul(df, level=0).replace(0, np.nan).mean(axis=1)
df = df2.join(s.rename('mean_gdp'), on=['year','ioname'])
print (df)
year ioname France Germany US Canada mean_gdp
0 2000 EU 1 1 0 0 200.0
1 2001 EU 1 1 0 0 232.5
2 2002 EU 1 1 0 0 241.5
3 2000 NAFTA 0 0 1 1 510.0
4 2001 NAFTA 0 0 1 1 551.0
5 2002 NAFTA 0 0 1 1 589.0