Как объединить и сделать групповые вычисления на наборах данных 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 ответа

Я думаю, что прямой путь состоит в том, чтобы поместить значения ВВП в borderDataFrame, Тогда все, что нужно, это просто 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'])
Другие вопросы по тегам