【问题标题】:Flatten hierarchically indexed pandas.DataFrame from groupby and multiple aggregation从 groupby 和多个聚合中展平层次索引 pandas.DataFrame
【发布时间】:2017-10-06 13:13:28
【问题描述】:

我按多列对数据框进行分组并聚合以获得多个统计信息。如何获得一个完全扁平的结构,其中每个可能的组键组合被枚举为行,每个统计数据都以列的形式出现?

import numpy as np
import pandas as pd

cities = ['Berlin', 'Oslo']
days = ['Monday', 'Friday']

data = pd.DataFrame({
        'city': np.random.choice(cities, 12),
        'day': np.random.choice(days, 12),
        'people': np.random.normal(loc=10, size=12),
        'cats': np.random.normal(loc=6, size=12)})
grouped = data.groupby(['city', 'day']).agg([np.mean, np.std])

这样我得到了:

                   cats               people          
                   mean       std       mean       std
city   day                                            
Berlin Friday  6.146924  0.721263  10.445606  0.730992
       Monday  5.239267       NaN   9.022811       NaN
Oslo   Friday  6.322276  0.866899  11.579813  0.114341
       Monday  5.028919  0.815674  10.458439  1.182689

我需要把它弄平:

city   day     cats_mean cats_std  people_mean people_std                                       
Berlin Friday  6.146924  0.721263  10.445606   0.730992
Berlin Monday  5.239267       NaN   9.022811        NaN
Oslo   Friday  6.322276  0.866899  11.579813   0.114341
Oslo   Monday  5.028919  0.815674  10.458439   1.182689

【问题讨论】:

  • 您可以调用grouped.reset_index() 将索引恢复到列
  • @EdChum 它仍然在那里留下一个 MultiIndex,因此很难将聚合统计信息作为列操作
  • 分配回grouped = grouped.reset_index(),好的,你也想展平列
  • 无济于事,仍然无法引用列,例如 grouped['mean'] 引发 KeyError
  • 对不起,我看到你也想把列弄平

标签: python pandas indexing aggregate


【解决方案1】:
In [36]: grouped.columns = grouped.columns.map('_'.join)

In [37]: grouped = grouped.reset_index()

In [38]: grouped
Out[38]:
     city     day  cats_mean  cats_std  people_mean  people_std
0  Berlin  Friday   5.852991  1.085163    11.078541    0.839688
1  Berlin  Monday   6.978343  0.630983     9.876106    1.846204
2    Oslo  Friday   6.096773  1.278176     9.710216    0.691672

【讨论】:

  • 这比我的解决方案 +1 更干净
【解决方案2】:

使用 pd.NamedAgg 更新

import numpy as np
import pandas as pd

cities = ['Berlin', 'Oslo']
days = ['Monday', 'Friday']

data = pd.DataFrame({
        'city': np.random.choice(cities, 12),
        'day': np.random.choice(days, 12),
        'people': np.random.normal(loc=10, size=12),
        'cats': np.random.normal(loc=6, size=12)})
grouped = data.groupby(['city', 'day']).agg(cats_mean=('cats', np.mean),
                                            cats_std=('cats', np.std),
                                            people_mean=('people', np.mean),
                                            people_std=('people', np.std))

grouped.reset_index()

不推荐使用嵌套重命名

您可以使用 .agg 中的字典重命名列,然后删除列级别和 reset_index(): 看到这个SO Post

将 numpy 导入为 np 将熊猫导入为 pd 城市 = ['柏林', '奥斯陆'] 天 = ['星期一','星期五'] 数据 = pd.DataFrame({ “城市”:np.random.choice(城市,12), 'day': np.random.choice(days, 12), '人': np.random.normal(loc=10, size=12), '猫': np.random.normal(loc=6, size=12)}) 分组 = data.groupby(['city', 'day']).agg({'cats':{'cats_mean':np.mean,'cats_std':np.std},'people':{'people_mean' :np.mean,'people_std':np.std}}) grouped.columns = grouped.columns.droplevel() grouped.reset_index() 罢工> ---------------

输出:

     city     day  people_mean  people_std  cats_std  cats_mean
0  Berlin  Friday     9.645190    0.699684  0.973866   6.478510
1  Berlin  Monday     9.556898    0.126810  0.336654   6.624288
2    Oslo  Friday    11.593491         NaN       NaN   6.206595
3    Oslo  Monday    10.202183    1.058651  0.657939   6.019748

【讨论】:

  • 请注意FutureWarning: using a dict with renaming is deprecated and will be removed in a future version。这是link
【解决方案3】:

您可以在列级别上执行列表推导并使用下划线连接,然后调用reset_index:

In [39]:    
grouped.columns= ['_'.join(x) for x in list(zip(grouped.columns.get_level_values(0), grouped.columns.get_level_values(1)))]
grouped = grouped.reset_index()
grouped

Out[39]:
     city     day  cats_mean  cats_std  people_mean  people_std
0  Berlin  Friday   6.140710  0.555981    10.187634    0.359724
1  Berlin  Monday   6.420175  0.986568    10.134376    0.963938
2    Oslo  Friday   6.978572  0.573297    11.345484    1.454762
3    Oslo  Monday   4.594814       NaN    10.842988         NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多