首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pandas groupby删除多个索引

问pandas groupby删除多个索引
EN

Stack Overflow用户
提问于 2019-12-30 11:06:09
回答 1查看 2.3K关注 0票数 3

我有一个dataframe,其中有一个列,我想按列值进行分组和排序。在groupby之后,我发现有多个索引,其中一个是源数据帧的索引,我想删除这个索引。

示例数据框:

代码语言:javascript
复制
> d = pd.DataFrame(np.array([[0, 0, 1, 1, 2, 2, 2],
                             [3, 4, 5, 6, 7, 8, 9],
                             [1.25, 10.1, 2.3, 2.4, 1.2, 5.5, 5.7]]).T,
                            columns=['a', 'b', 'c'])

> d
    a   b   c
0   0.0 3.0 1.25
1   0.0 4.0 10.10
2   1.0 5.0 2.30
3   1.0 6.0 2.40
4   2.0 7.0 1.20
5   2.0 8.0 5.50
6   2.0 9.0 5.70

我要应用的函数:

代码语言:javascript
复制
def top_all(df,column='b'):
    return df.sort_index(by=column,ascending=True)

我如何使用groupby:

代码语言:javascript
复制
d.groupby('a').apply(top_all)

我得到的结果是:

代码语言:javascript
复制
        a   b   c
 a              
0.0 0   0.0 3.0 1.25
    1   0.0 4.0 10.10
1.0 2   1.0 5.0 2.30
    3   1.0 6.0 2.40
2.0 4   2.0 7.0 1.20
    5   2.0 8.0 5.50
    6   2.0 9.0 5.70

我希望得到这样的结果:

代码语言:javascript
复制
        a   b   c
 a              
0.0   0.0   3.0 1.25
      0.0   4.0 10.10
1.0   1.0   5.0 2.30
      1.0   6.0 2.40
2.0   2.0   7.0 1.20
      2.0   8.0 5.50
      2.0   9.0 5.70

更新:

我尝试了reset_index with level,但结果不包含level。我想要的结果是groupby格式,这意味着列a的值应该在索引中拆分到不同的组中。我不知道我是不是说清楚了。

代码语言:javascript
复制
> d.groupby('a').apply(top_all).reset_index(level=1, drop=True)
> d
    a   b   c
a           
0.0 0.0 3.0 1.25
0.0 0.0 4.0 10.10
1.0 1.0 5.0 2.30
1.0 1.0 6.0 2.40
2.0 2.0 7.0 1.20
2.0 2.0 8.0 5.50
2.0 2.0 9.0 5.70
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-30 13:01:21

我能想到的完成这项任务的唯一方法就是使用openpyxl。首先,使用pandas将输出保存到具有多索引的excel中,然后使用openpyxl删除列,以保持您要查找的格式。

代码语言:javascript
复制
# export multi-index DataFrame to excel
d.groupby('a').apply(top_all).to_excel('python/test.xlsx')

import openpyxl
# open xlsx doc
book = openpyxl.load_workbook('python/test.xlsx')
# use active sheet
sheet = book.active
# delete col
sheet.delete_cols(2)
#save book
book.save('python/test.xlsx')

​

​

如果不希望在excel中显示索引名称(当前将有重复的列:'a'):

代码语言:javascript
复制
group = d.groupby('a').apply(top_all)
group.index.names = [None, None] # set index names to None
group.to_excel('python/test.xlsx')

# open xlsx doc
book = openpyxl.load_workbook('python/test.xlsx')
# use active sheet
sheet = book.active
# delete col
sheet.delete_cols(2)
#save book
book.save('python/test.xlsx')

​

​

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59525252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档