Как объединить и сделать групповые вычисления на наборах данных Pandas?
Я работаю над экономическим документом и мне нужна помощь в объединении и преобразовании двух наборов данных.
У меня есть два кадра данных панд, один со списком стран и их соседей (borderdf), таких как
borderdf
country neighbor
sweden norway
sweden denmark
denmark germany
denmark sweden
и один с данными (datadf) для каждой страны и года, такими как
datadf
country gdp year
sweden 5454 2004
sweden 5676 2005
norway 3433 2004
norway 3433 2005
denmark 2132 2004
denmark 2342 2005
Мне нужно создать столбец в datadf для соседей meangdp, который будет содержать среднее значение ВВП всех соседей, заданное соседей. Я хотел бы, чтобы мой результат выглядел так:
datadf
country year gdp neighborsmeangdp
sweden 2004 5454 5565
sweden 2005 5676 5775
Как мне это сделать?
2 ответа
Я думаю, что прямой путь состоит в том, чтобы поместить значения ВВП в border
DataFrame
, Тогда все, что нужно, это просто sum
groupby
объект, а затем сделать merge
:
In [178]:
borderdf[2004]=[datadf2.ix[(item, 2004)].values[0] for item in borderdf.neighbor]
borderdf[2005]=[datadf2.ix[(item, 2005)].values[0] for item in borderdf.neighbor]
gpdf=borderdf.groupby(by=['country']).sum()
df=pd.DataFrame(gpdf.unstack(), columns=['neighborsmeangdp'])
df=df.reset_index()
df=df.rename(columns = {'level_0':'year'})
print pd.ordered_merge(datadf, df)
country gdp year neighborsmeangdp
0 denmark 2132 2004 7586
1 germany 2132 2004 NaN
2 norway 3433 2004 NaN
3 sweden 5454 2004 5565
4 denmark 2342 2005 8018
5 germany 2342 2005 NaN
6 norway 3433 2005 NaN
7 sweden 5676 2005 5775
[8 rows x 4 columns]
Конечно, я должен сделать некоторые данные для Германии,
germany 2132 2004
germany 2342 2005
Что, я уверен, на самом деле она делает лучше.
Вы можете напрямую объединить два с помощью панд merge
функция. Хитрость заключается в том, что вы действительно хотите объединить колонку страны в своем datadf
с соседним столбцом в вашем borderdf
, Тогда используйте groupby
а также mean
чтобы получить среднестатистического соседа ввп. Наконец, объединитесь с данными, чтобы получить собственный ВВП страны. Например:
import pandas as pd
from StringIO import StringIO
border_csv = '''
country, neighbor
sweden, norway
sweden, denmark
denmark, germany
denmark, sweden
'''
data_csv = '''
country, gdp, year
sweden, 5454, 2004
sweden, 5676, 2005
norway, 3433, 2004
norway, 3433, 2005
denmark, 2132, 2004
denmark, 2342, 2005
'''
borders = pd.read_csv(StringIO(border_csv), sep=',\s*', header=1)
data = pd.read_csv(StringIO(data_csv), sep=',\s*', header=1)
merged = pd.merge(borders,data,left_on='neighbor',right_on='country')
merged = merged.drop('country_y', axis=1)
merged.columns = ['country','neighbor','gdp','year']
grouped = merged.groupby(['country','year'])
neighbor_means = grouped.mean()
neighbor_means.columns = ['neighbor_gdp']
neighbor_means.reset_index(inplace=True)
results_df = pd.merge(neighbor_means,data, on=['country','year'])