大熊猫的.groupby对面是否有"取消组合"操作?

mkl*_*kln 17 python group-by pandas pandas-groupby

假设我们从这个简单的表开始,存储在pandas数据帧中:

    name  age  family
0   john    1       1
1  jason   36       1
2   jane   32       1
3   jack   26       2
4  james   30       2
Run Code Online (Sandbox Code Playgroud)

然后我做

group_df = df.groupby('family')
group_df = group_df.aggregate({'name': name_join, 'age': pd.np.mean})
Run Code Online (Sandbox Code Playgroud)

其中groupby()是名称的简单聚合函数:

def name_join(list_names, concat='-'):
    return concat.join(list_names)
Run Code Online (Sandbox Code Playgroud)

输出是:

        age             name
family                      
1        23  john-jason-jane
2        28       jack-james
Run Code Online (Sandbox Code Playgroud)

现在的问题.

是否有快速,有效的方法从聚合表中获取以下内容?

    name  age  family
0   john   23       1
1  jason   23       1
2   jane   23       1
3   jack   28       2
4  james   28       2
Run Code Online (Sandbox Code Playgroud)

(注意:数字只是示例,我不关心在此具体示例中取平均值后丢失的信息)

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

  1. 创建空数据帧
  2. 从每一行开始name_join,将名称分开
  3. 返回一个数据帧,其行数与起始行中的名称一样多
  4. 将输出附加到空数据帧

Dan*_*lan 15

将操作视为groupby的"对立面"可能没有帮助.

您正在将一个字符串拆分为多个部分,并维护每个部分与"family"的关联.我的这个老答案完成了这项工作.

首先将'family'设置为索引列,参考上面的链接,然后.reset_index()在结尾处获得所需的结果.


小智 7

这是一个完整的示例,从分组对象中恢复原始数据帧

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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)


Mat*_*cho 6

事实证明,它pd.groupby()返回一个对象,其中原始数据存储在obj. 所以取消分组只是拉出原始数据。

group_df = df.groupby('family')
group_df.obj
Run Code Online (Sandbox Code Playgroud)

例子

>>> 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]
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的技巧,但恐怕它可能无法适应未来。我想到了 Hadley Wickham 关于可维护代码的[谈话](https://www.youtube.com/watch?v=izFssYRsLZs&amp;list=PL9HYL-VRX0oRjeraSIEaY0V_9gx52wdkV)。他警告不要过度使用功能。函数维护者可能不知道最终用户以这种方式使用该函数,因此他/她可能会修改函数行为,但没有意识到这可能会破坏现有的下游代码。你怎么认为? (2认同)
  • @HanyNagaty 我在这里打开了一个关于 Pandas 的 GitHub 问题。如果您喜欢此功能,请支持。https://github.com/pandas-dev/pandas/issues/43902 (2认同)