【问题标题】:How do I aggregate sub-dataframes in pandas?如何在 pandas 中聚合子数据框?
【发布时间】:2018-01-25 00:55:42
【问题描述】:

假设我有两级多索引数据框

In [1]: index = pd.MultiIndex.from_tuples([(i,j)  for i in range(3)
      :                                           for j in range(1+i)], names=list('ij') )
      : df = pd.DataFrame(0.1*np.arange(2*len(index)).reshape(-1,2),
      :                   columns=list('xy'), index=index )
      : df
Out[1]:
      x    y
i j
0 0  0.0  0.1
1 0  0.2  0.3
  1  0.4  0.5
2 0  0.6  0.7
  1  0.8  0.9
  2  1.0  1.1

我想在每个子数据帧上运行一个自定义函数:

In [2]: def my_aggr_func(subdf):
      :     return subdf['x'].mean() / subdf['y'].mean()
      :
      : level0 = df.index.levels[0].values
      : pd.DataFrame({'mean_ratio': [my_aggr_func(df.loc[i]) for i in level0]},
      :              index=pd.Index(level0, name=index.names[0]) )
Out[2]:
     mean_ratio
i
0    0.000000
1    0.750000
2    0.888889

有没有一种优雅的方式来使用df.groupby('i').agg(__something__) 或类似的东西?

【问题讨论】:

    标签: pandas aggregation multi-index


    【解决方案1】:

    需要GroupBy.apply,与DataFrame合作:

    df1 = df.groupby('i').apply(my_aggr_func).to_frame('mean_ratio')
    print (df1)
       mean_ratio
    i            
    0    0.000000
    1    0.750000
    2    0.888889
    

    【讨论】:

    • 谢谢!我完全忘记了apply
    【解决方案2】:

    您不需要自定义函数。您可以使用agg 计算“组内均值”,然后执行eval 以获得您想要的比率。

    df.groupby('i').agg('mean').eval('x / y')
    
    i
    0    0.000000
    1    0.750000
    2    0.888889
    dtype: float64
    

    【讨论】:

    • 我想要更复杂的东西。例如,将 y(x) 与 fit 的一些函数和输出参数拟合。
    • 我建议您接受@jezrael 的回答,并针对您的具体问题询问其他人。通常,SO 上的某个人可以帮助您找到更复杂的解决方案来解决您更复杂的问题。如果fit 表示回归,您可以考虑在新问题上添加sklearnnumpy 标签。这样,其他关注这些标签而不是[pandas] 的聪明人也会看到它。
    猜你喜欢
    • 2017-06-23
    • 2021-01-22
    • 2018-11-09
    • 2021-11-04
    • 1970-01-01
    • 2017-02-05
    • 2012-08-26
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多