Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas`DataFrameGroupBy`和`SeriesGroupBy`_Python_Group By_Pandas - Fatal编程技术网

Python Pandas`DataFrameGroupBy`和`SeriesGroupBy`

Python Pandas`DataFrameGroupBy`和`SeriesGroupBy`,python,group-by,pandas,Python,Group By,Pandas,我承认我不是Python大师,但我仍然发现处理PandasDataFrameGroupBy和SeriesGroupBy对象异常违反直觉。(我有R的背景。) 我的数据框架如下: import pandas as pd import numpy as np df = pd.DataFrame({'id' : range(1,9), 'code' : ['one', 'one', 'two', 'three',

我承认我不是Python大师,但我仍然发现处理Pandas
DataFrameGroupBy
SeriesGroupBy
对象异常违反直觉。(我有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'])
我希望能够获得按
code
color
分组的
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和color=white}情况下的
id
s?我尝试了
gb.get_组('one','white')
gb.get_组(['one','white'))
,但它们不起作用

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


4)最后,没有太大帮助,您知道有哪些来源提供了如何创建和访问这些分组对象的示例吗?

对于您的问题,您甚至不需要执行
分组方式(但您应该在

更好的解决方案是使用多索引

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]
那就够了

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标记,文档的一部分是,上面链接的散文文档。

谢谢你,汤姆,我不想把整个df存储在内存中(它很大),只想存储
id
列。这是实现这一点的最好方法吗:
df=df.set_index(['code',color'])。sort_index();df=df['id']
?另外,您之所以推荐这种索引重置方法,是因为它比
groupby()更快
?对于大型数据集,请看一看HDF/pandas工作流,该工作流非常适合处理这些横截面。我不确定您的
id
问题,但如果您只需要
id
,则无需使用
set\u index
。这会更快,但也更合适。通常使用
groupby
,您就可以e正在执行
split-apply-combine
操作。在这种情况下,看起来您只有
split
部分,由
.loc
.xs
索引处理。很好,最后您可以简单地澄清一下:“我不确定您的id问题,但如果您只需要id,就不需要使用
设置索引
”我只想看到
id
列,我对其余的列不感兴趣。那么代码是什么?如果你只想要
id
列,它就是
df=df['id']
,或者更好的做法是,首先只阅读该列。但我不完全确定为什么您只需要
id
列。我想稍后在我的代码中使用
df
(在单独的函数中)作为查找表,检索与给定代码/颜色组合匹配的
id
s列表。其他列对于其他操作是必需的,但对于此查找对象不是必需的。