2

私は経済学の論文に取り組んでおり、2 つのデータセットの結合と変換について助けが必要です。

私は2つのパンダデータフレームを持っています.1つは国とその隣人(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

私は、neighbordf によって与えられたように、すべての隣人の gdp の平均を含む、neighbormeangdp の datadf に列を作成する必要があります。結果を次のようにしたいと思います。

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

これを行うにはどうすればよいですか?

4

2 に答える 2

0

直接的な方法は、GDP 値を に入れることだと思います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

実際には彼女の方がうまくいっていると私は確信しています。

于 2014-04-22T17:19:18.657 に答える
0

pandasmerge関数を使用して、2 つを直接マージできます。ここでの秘訣は、実際には のcountrydatadfを のneighbour列とマージしたいということです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'])
于 2014-04-22T18:02:54.857 に答える