V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
darktone
V2EX  ›  Python

请教各位,在 pandas 中 groupby 技术,如何给原始数据添加多级索引的 key?

  •  
  •   darktone · 2018-05-12 07:48:11 +08:00 · 2502 次点击
    这是一个创建于 2389 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个形如以下的学生成绩表,求男同学和女同学的平均成绩:

    ''' frame=pd.DataFrame({'姓名':['甲','乙','丙','丁','戊','己','庚'], '成绩':range(70,0,-10), '性别':['男','男','男','女','女','女','女'], 'd':[0,1,2,0,1,2,3] }) '''

    其结构如下: d 姓名 性别 成绩 0 0 甲 男 70 1 1 乙 男 60 2 2 丙 男 50 3 0 丁 女 40 4 1 戊 女 30 5 2 己 女 20 6 3 庚 女 10

    ''' #转换成多级索引

    frame2=frame.set_index(['性别','d'])

    #以性别分组求平均

    frame2.groupby('性别').mean() '''

    结果如下

    Out[60]: 成绩 性别
    女 25 男 60

    以上步骤基本会做了,但是………………

    我的疑惑是,如果原始数据中没有 d 列,仅仅是一个最常见的学生成绩表:

    ''' frame=pd.DataFrame({'姓名':['甲','乙','丙','丁','戊','己','庚'], '成绩':range(70,0,-10), '性别':['男','男','男','女','女','女','女'], }) '''

    这种情况,如何添加 d 列,如果成绩表数据较多,总不可能人工去数数添加吧?

    初学,我的理解是没有多级索引 key,就没办法使用 groupby。

    如何给没有多级索引 key 的原始数据,添加上去呢??

    3 条回复    2018-05-16 07:39:54 +08:00
    enenaaa
        1
    enenaaa  
       2018-05-12 17:22:31 +08:00
    groupby 跟索引没关系。
    dengshuang
        2
    dengshuang  
       2018-05-13 20:55:12 +08:00
    groupby 聚合数据 比如:['甲','乙','丙','丁','戊','己','庚'] 6 位同学,3 男 3 女 ,你想看男的都有谁,data.groupby['男']
    crsroy
        3
    crsroy  
       2018-05-16 07:39:54 +08:00
    import pandas as pd

    df = pd.DataFrame({'姓名':['甲','乙','丙','丁','戊','己','庚'], '成绩':range(70,0,-10), '性别':['男','男','男','女','女','女','女'], 'd':[0,1,2,0,1,2,3] })

    #假设原数据没有'd'列
    df2 = df[['姓名','成绩','性别']]
    #直接用性别分组可以得到分组统计
    grouped = df2.groupby('性别')
    print(grouped.mean())
    #使用 rank 函数得到性别分组排号
    df2['d'] = df2['成绩'].groupby(df2['性别']).rank(ascending = 0)
    print(df2)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3222 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:20 · PVG 21:20 · LAX 05:20 · JFK 08:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.