假设我们从这个简单的表开始,存储在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)
(注意:数字只是示例,我不关心在此具体示例中取平均值后丢失的信息)
我认为我能做到的方式看起来效率不高:
有两个问题看似相似,但它们不是同一个问题:这里和这里.它们都调用了一种方法GroupBy,例如count()或者aggregate(),我知道它会返回一个方法DataFrame.我要问的是如何将GroupBy(类pandas.core.groupby.DataFrameGroupBy)对象本身转换为DataFrame.我将在下面说明.
构造DataFrame如下示例.
data_list = []
for name in ["sasha", "asa"]:
for take in ["one", "two"]:
row = {"name": name, "take": take, "score": numpy.random.rand(), "ping": numpy.random.randint(10, 100)}
data_list.append(row)
data = pandas.DataFrame(data_list)
Run Code Online (Sandbox Code Playgroud)
上面DataFrame应该如下所示(显然有不同的数字).
name ping score take
0 sasha 72 0.923263 one
1 sasha 14 0.724720 two
2 asa 76 0.774320 one
3 asa 71 0.128721 two
Run Code Online (Sandbox Code Playgroud)
我想要做的是按"name"和"take"( …