pandas中是否有与.groupby相对的“ungroup by”操作?

btxsgosb  于 2023-11-15  发布在  其他
关注(0)|答案(4)|浏览(143)

假设我们拿一个Pandas相框...

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_join聚合了名称):

def name_join(list_names, concat='-'):
    return concat.join(list_names)


因此,分组汇总输出为:

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


(Note:age列值只是示例,我不关心在此特定示例中求平均值后丢失的信息)

ymdaylpp

ymdaylpp1#

粗略的等价物是.reset_index(),但将其视为groupby()的“相反”可能没有帮助。

你把一根弦分成几段,并保持每一段与“家庭”的联系。我的这个老答案可以完成这项工作。
只需首先将'family'设置为索引列,参考上面的链接,然后在最后输入reset_index()即可获得所需的结果。

vfhzx4xs

vfhzx4xs2#

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

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]

pprl5pva

pprl5pva3#

下面是一个完整的例子,从分组对象中恢复原始的Restrame

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

个字符

vwhgwdsa

vwhgwdsa4#

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

相关问题