假设我们从这个简单的表开始,存储在pandas数据帧中:
name age family
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 = 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
(注意:数字只是示例,我不关心在这个具体示例中取平均值之后丢失的信息)
我认为我能做到的方式看起来效率不高:
group_df
中的每一行,将名称分开答案 0 :(得分:11)
将操作视为groupby的“对立面”可能没有帮助。
您正在将字符串拆分为多个部分,并维护每个部分与“系列”的关联。 This old answer of mine完成这项工作。
首先将'family'设置为索引列,请参阅上面的链接,然后在最后找到reset_index()
以获得所需的结果。
答案 1 :(得分:5)
事实证明,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]
答案 2 :(得分:0)
有几种方法可以撤消DataFrame.groupby,一种方法是执行DataFrame.groupby.filter(lambda x:True),这可以返回到原始DataFrame。
答案 3 :(得分:0)
这是一个完整的示例,可以从分组的对象中恢复原始数据帧
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
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