Python 是否有一个「;按“取消分组”;在熊猫中与groupby相反的操作?

Python 是否有一个「;按“取消分组”;在熊猫中与groupby相反的操作?,python,pandas,group-by,pandas-groupby,Python,Pandas,Group By,Pandas Groupby,假设我们使用熊猫数据帧 name age family 0 john 1 1 1 jason 36 1 2 jane 32 1 3 jack 26 2 4 james 30 2 然后执行groupby() group_df = df.groupby('family') group_df = group_df.aggregate({'name': name_join, 'age': pd

假设我们使用熊猫数据帧

    name  age  family
0   john    1       1
1  jason   36       1
2   jane   32       1
3   jack   26       2
4  james   30       2
然后执行
groupby()

group_df = df.groupby('family')
group_df = group_df.aggregate({'name': name_join, 'age': pd.np.mean})
然后执行一些聚合/汇总操作(在我的示例中,我的函数
name\u join
聚合名称):

因此,分组汇总输出为:

        age             name
family                      
1        23  john-jason-jane
2        28       jack-james
问题: 是否有一种快速、有效的方法从聚合表获取以下内容

    name  age  family
0   john   23       1
1  jason   23       1
2   jane   23       1
3   jack   28       2
4  james   28       2
(注意:
age
列值仅为示例,我不关心在此特定示例中求平均值后丢失的信息)

我认为我能做到的方式看起来效率不高:

  • 创建空数据帧
  • 组中的每一行中,将名称分开
  • 返回一个数据帧,其行数与起始行中的名称数相同
  • 将输出附加到空数据帧

  • 大致相当于
    .reset_index()
    ,但将其视为
    groupby()
    的“反面”可能没有帮助

    您正在将字符串拆分为多个片段,并维护每个片段与“家族”的关联。他做这项工作


    只需首先将“family”设置为索引列,参考上面的链接,然后在最后
    reset_index()
    以获得所需的结果。

    有几种方法可以撤消DataFrame.groupby,其中一种方法是执行DataFrame.groupby.filter(lambda x:True),这将返回到原始数据帧。

    以下是从分组对象恢复原始数据帧的完整示例

    def name_join(list_names, concat='-'):
        return concat.join(list_names)
    
    print('create dataframe\n')
    df = pandas.DataFrame({'name':['john', 'jason', 'jane', 'jack', 'james'], 'age':[1,36,32,26,30], 'family':[1,1,1,2,2]})
    df.index.name='indexer'
    print(df)
    print('create group_by object')
    group_obj_df = df.groupby('family')
    print(group_obj_df)
    
    print('\nrecover grouped df')
    group_joined_df = group_obj_df.aggregate({'name': name_join, 'age': 'mean'})
    group_joined_df
    
    
    create dataframe
    
              name  age  family
    indexer                    
    0         john    1       1
    1        jason   36       1
    2         jane   32       1
    3         jack   26       2
    4        james   30       2
    create group_by object
    <pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fbfdd9dd048>
    
    recover grouped df 
                       name  age
    family                      
    1       john-jason-jane   23
    2            jack-james   28
    

    结果是,
    pd.groupby()
    返回一个对象,其中包含存储在
    obj
    中的原始数据。因此,解组就是提取原始数据

    group_df = df.groupby('family')
    group_df.obj
    
    例子
    >dat_1=df.groupby(“类别_2”)
    >>>dat_1
    >>>dat_1.obj
    订单\日期类别\ 2值
    2011年02月01日越野赛324400.0
    2 2011-03-01越野赛142000.0
    3 2011-04-01越野赛498580.0
    4 2011-05-01越野赛220310.0
    5 2011-06-01越野赛364420.0
    ..         ...                 ...       ...
    535 2015-08-01 Triathalon 39200.0
    536 2015-09-01 Triathalon 75600.0
    537 2015-10-01 Triathalon 58600.0
    538 2015-11-01 Triathalon 70050.0
    539 2015-12-01 Triathalon 38600.0
    [531行x 3列]
    
    太棒了!我仍然在研究apply、lambda、pd.Series和stack的组合,但它完全按照预期工作。谢谢可能是@AndyHayden的复制品:也许,但这个问题的标题很糟糕;这一点很简单。(因此,如果只有示例用例需要改进,最好对其进行改进,而不是关闭它)“存储在数据帧中的表”是迂回的。只需学习将数据帧视为一个表(如果它代表的是表的话)。问题有点难处理:与其执行聚合/汇总操作,然后将其反转,只需在
    groupby()之后停止,必要时对
    age
    进行一些平均,然后执行
    reset\u index()
    AttributeError:“function”对象在问题上下文中没有属性“filter”,它将是group_df.filter(lambda x:True)。为我工作。具有复制到新数据帧的开销。
    print('\nRecover the original dataframe')
    print(pandas.concat([group_obj_df.get_group(key) for key in group_obj_df.groups]))
    
    Recover the original dataframe
              name  age  family
    indexer                    
    0         john    1       1
    1        jason   36       1
    2         jane   32       1
    3         jack   26       2
    4        james   30       2
    
    group_df = df.groupby('family')
    group_df.obj
    
    >>> dat_1 = df.groupby("category_2")
    >>> dat_1
    <pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fce78b3dd00>
    >>> dat_1.obj
        order_date          category_2     value
    1   2011-02-01  Cross Country Race  324400.0
    2   2011-03-01  Cross Country Race  142000.0
    3   2011-04-01  Cross Country Race  498580.0
    4   2011-05-01  Cross Country Race  220310.0
    5   2011-06-01  Cross Country Race  364420.0
    ..         ...                 ...       ...
    535 2015-08-01          Triathalon   39200.0
    536 2015-09-01          Triathalon   75600.0
    537 2015-10-01          Triathalon   58600.0
    538 2015-11-01          Triathalon   70050.0
    539 2015-12-01          Triathalon   38600.0
    
    [531 rows x 3 columns]