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]