【问题标题】:How to combine and do group computations on Pandas datasets?如何对 Pandas 数据集进行组合和分组计算?
【发布时间】:2014-06-07 00:50:13
【问题描述】:

我正在撰写一篇经济学论文,在合并和转换两个数据集方面需要一些帮助。

我有两个 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 中为 neighbormeangdp 创建一个列,该列将包含所有邻居的 gdp 的平均值,由 neighbordf 给出。我希望我的结果如下所示:

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

我该怎么做呢?

【问题讨论】:

  • 为什么这个问题被认为是to board,有人愿意解释一下吗?
  • 我也不明白为什么它太宽泛了。我认为标题中的问题措辞过于宽泛,但问题本身却非常具体。 OP 给出了示例输入和示例输出。
  • 因为描述您的要求并要求某人为您编写代码或解释如何编写代码的问题被认为是 Stack Overflow 的题外话,但没有任何标准的关闭原因适用。有些人似乎认为“太宽泛”、“不清楚你在问什么”或“缺乏足够的信息来诊断问题”总是足以涵盖这类问题,但这个案例说明了为什么他们通常不这样做传达正确的信息。
  • 啊,好吧。所以它有点“因提问者的努力不足而关闭”?

标签: python pandas economics


【解决方案1】:

我认为直接的方法是将 GDP 值放入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

我相信她实际上做得更好。

【讨论】:

    【解决方案2】:

    您可以使用 pandas merge 函数直接合并两者。 这里的技巧是您实际上希望将datadf 中的country 列与borderdf 中的neighbor 列合并。 然后使用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'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2016-06-17
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多