热线电话:13121318867

登录
2019-03-01 阅读量: 1848
使用pandas groupby后恢复标准的单索引数据框

我想在Python数据帧中为每个组应用自定义缩减功能。该函数通过执行组合该组的多个列的操作将组简化为单行。

我已经实现了这样:

import pandas as pd

import numpy as np

df = pd.DataFrame(data={

"afac": np.random.random(size=1000),

"bfac": np.random.random(size=1000),

"class":np.random.randint(low=0,high=5,size=1000)

})

def f(group):

total_area = group['afac'].sum()

per_area = (group['afac']/total_area).values

per_pop = group['bfac'].values

return pd.DataFrame(data={'per_apop': [np.sum(per_area*per_pop)]})

aggdf = df.groupby('class').apply(f)

进入这段代码,我的df数据框如下所示:

>>> df

afac bfac class

0 0.689969 0.992403 0

1 0.688756 0.728763 1

2 0.086045 0.499061 1

3 0.078453 0.198435 2

4 0.621589 0.812233 4

这很好,很正常!

但是从数据框架出来,我得到了这个:

>>> aggdf

per_apop

class

0 0 0.553292

1 0 0.503112

2 0 0.444281

3 0 0.517646

4 0 0.503290

我认为这是一种多索引框架。

我已经尝试了各种方法来回到“正常”的数据框架,但似乎都没有。

>>> aggdf.reset_index()

class level_1 per_apop

0 0 0 0.553292

1 1 0 0.503112

2 2 0 0.444281

3 3 0 0.517646

4 4 0 0.503290

>>> aggdf.unstack().reset_index()

class per_apop

0

0 0 0.553292

1 1 0.503112

2 2 0.444281

3 3 0.517646

4 4 0.503290

如何执行此操作并在之后获得正常的数据框?

解决办法:让你的自我反省功能回归 Series

def f(group):

total_area = group['afac'].sum()

per_area = (group['afac']/total_area).values

per_pop = group['bfac'].values

return pd.Series(data={'per_apop': np.sum(per_area*per_pop)})

df.groupby('class').apply(f).reset_index()

class per_apop

0 0 0.508332

1 1 0.505593

2 2 0.488117

3 3 0.481572

4 4 0.500401

17.9321
2
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子