2014-04-22 42 views
2

我正在撰寫經濟論文,需要一些幫助來合併和轉換兩個數據集。如何在Pandas數據集上進行組合和分組計算?

我有兩隻大熊貓dataframes,一個與國家的名單和他們的鄰居(borderdf)如

​​3210

和一個與每個國家和年份等數據(datadf)作爲

datadf 
country gdp year 
sweden  5454 2004 
sweden  5676 2005 
norway  3433 2004 
norway  3433 2005 
denmark 2132 2004 
denmark 2342 2005 

我需要在datadf中爲neighbormeangdp創建一個列,其中包含neighbordf給出的所有鄰居的gdp的平均值。我希望我的結果如下所示:

datadf 
country year gdp neighborsmeangdp 
sweden  2004 5454 5565 
sweden  2005 5676 5775 

我該如何去做這件事?

+2

爲什麼這個問題認爲是「板」,任何人都在關心解釋? –

+1

我也不明白爲什麼它太寬泛。我認爲標題中的問題措辭過於寬泛,但問題本身非常具體。 OP給出了示例輸入和示例輸出。 – exp1orer

+0

由於描述您的需求並要求某人爲您編寫代碼或解釋如何編寫代碼的問題被認爲是堆棧溢出的主題,但沒有一個標準的緊密原因適用。有些人似乎認爲「太寬泛」,「不清楚你問的是什麼」或者「缺乏足夠的信息來診斷問題」總是足以涵蓋這些類型的問題,但這種情況說明了爲什麼他們經常不得到正確的信息。 –

回答

0

我認爲直接的方法是把國內生產總值的borderDataFrame。然後,所有需要的是隻是sumgroupby對象,然後做一個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 

我確信在現實她做得更好。

0

您可以直接合並使用大熊貓merge函數。 這裏的訣竅是,您實際上想要合併您的datadf中的國家列與borderdf中的鄰居列。 然後使用groupbymean來獲得平均鄰居gdp。 最後,與數據合併以獲得國家的GDP。 例如:

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']) 
相關問題