【问题标题】:Pandas `DataFrameGroupBy` and `SeriesGroupBy`熊猫`DataFrameGroupBy`和`SeriesGroupBy`
【发布时间】:2014-01-15 13:43:04
【问题描述】:

我承认我不是 Python 专家,但我仍然发现处理 Pandas DataFrameGroupBySeriesGroupBy 对象异常违反直觉。 (我有 R 背景。)

我有下面的数据框:

import pandas as pd
import numpy as np
df = pd.DataFrame({'id' : range(1,9),
                   'code' : ['one', 'one', 'two', 'three',
                             'two', 'three', 'one', 'two'],
                   'colour': ['black', 'white','white','white',
                           'black', 'black', 'white', 'white'],
                   'irrelevant1': ['foo', 'foo', 'foo','bar','bar',
                                     'foo','bar','bar'],
                   'irrelevant2': ['foo', 'foo', 'foo','bar','bar',
                                     'foo','bar','bar'],
                   'irrelevant3': ['foo', 'foo', 'foo','bar','bar',
                                     'foo','bar','bar'],
                   'amount' : np.random.randn(8)},  columns= ['id','code','colour', 'irrelevant1', 'irrelevant2', 'irrelevant3', 'amount'])

我希望能够获得按codecolour 分组的id。下面的代码进行分组但保留所有列。

gb = df.groupby(['code','colour'])
gb.head(5)
                id   code colour irrelevant1 irrelevant2 irrelevant3    amount
code  colour                                                                  
one   black  0   1    one  black         foo         foo         foo -0.644170
      white  1   2    one  white         foo         foo         foo  0.912372
             6   7    one  white         bar         bar         bar  0.530575
three black  5   6  three  black         foo         foo         foo -0.123806
      white  3   4  three  white         bar         bar         bar -0.387080
two   black  4   5    two  black         bar         bar         bar -0.578107
      white  2   3    two  white         foo         foo         foo  0.768637
             7   8    two  white         bar         bar         bar -0.282577

问题:

1)gb 中,我如何只存储id 列(甚至没有任何索引)并摆脱其余部分?

2) 获得所需的DataFrameGroupBy gb 后,如何访问{code = one and colour=white} 的ids 情况?我尝试了gb.get_group('one','white')gb.get_group(['one','white']),但它们不起作用。

3)如何访问 {colour=white} 的条目,即缺少 code 索引?

4) 最后,manual 不是很有帮助,您知道有哪些来源有关于如何创建和访问这些分组对象的示例吗?

【问题讨论】:

    标签: python group-by pandas


    【解决方案1】:

    对于您的问题,您甚至不需要执行groupby(但您应该在prose docs 中了解更多信息。

    更好的解决方案是MultiIndex:

    In [36]: df = df.set_index(['code', 'colour']).sort_index()
    
    In [37]: df
    Out[37]: 
                  id irrelevant1 irrelevant2 irrelevant3    amount
    code  colour                                                  
    one   black    1         foo         foo         foo  0.103045
          white    2         foo         foo         foo  0.751824
          white    7         bar         bar         bar -1.275114
    three black    6         foo         foo         foo  0.311305
          white    4         bar         bar         bar -0.416722
    two   black    5         bar         bar         bar  1.534859
          white    3         foo         foo         foo -1.068399
          white    8         bar         bar         bar -0.243893
    
    [8 rows x 5 columns]
    

    这会照顾到1

    2:使用熟悉的切片语法:

    In [38]: df.loc['one', 'white']
    Out[38]: 
                 id irrelevant1 irrelevant2 irrelevant3    amount
    code colour                                                  
    one  white    2         foo         foo         foo  0.751824
         white    7         bar         bar         bar -1.275114
    
    [2 rows x 5 columns]
    

    3:这是一个横截面,使用.xs

    In [39]: df.xs('white', level='colour')
    Out[39]: 
           id irrelevant1 irrelevant2 irrelevant3    amount
    code                                                   
    one     2         foo         foo         foo  0.751824
    one     7         bar         bar         bar -1.275114
    three   4         bar         bar         bar -0.416722
    two     3         foo         foo         foo -1.068399
    two     8         bar         bar         bar -0.243893
    
    [5 rows x 5 columns]
    

    4:例子比比皆是。在此处检查 pandas / groupby 标记,文档的 this 部分是 worked on right now,上面链接的散文文档。

    【讨论】:

    • 谢谢汤姆,我不想将整个 df 存储在内存中(它很大),而只是存储 id 列。这是实现这一目标的最佳方法:df = df.set_index(['code', 'colour']).sort_index(); df = df['id'] 吗?另外,您推荐这种索引重置方法的原因是因为它比groupby() 快吗?
    • 对于大型数据集,请查看 this question 以获得非常适合执行这些横截面的 HDF / pandas 工作流程。我不确定您的id 问题,但如果您只需要id,则无需使用set_index。这会更快,但也更合适。通常使用groupby,您正在执行split-apply-combine 操作。在这种情况下,您似乎只有 split 部分,.loc.xs 索引句柄。
    • 太好了,最后你能简单地澄清一下吗:“我不确定你的 id 问题,但如果你只需要 id 就没有必要使用set_index。”我只想看id 栏目,对其余栏目不感兴趣。那么代码是什么?
    • 如果您只想要id 列,它只是df = df['id'],或者最好只阅读该列。我不完全确定您为什么只需要 id 列。
    • 我想稍后在我的代码中(在一个单独的函数中)使用df 作为查找表来检索与给定代码/颜色组合匹配的ids 列表。其他列对于其他操作是必需的,但对于此查找对象不是。
    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2014-01-07
    • 1970-01-01
    • 2018-05-07
    • 2021-06-16
    • 2013-10-24
    相关资源
    最近更新 更多