Python Pandas Multiindex和Groupby返回奇数行为

Python Pandas Multiindex和Groupby返回奇数行为,python,pandas,dataframe,indexing,pandas-groupby,Python,Pandas,Dataframe,Indexing,Pandas Groupby,我现在正在与Pandas多索引数据帧一起工作几周,我感觉我并没有真正理解GroupBy对象背后的直觉,尤其是对组的选择 让我们以这段代码为例: import numpy as np import pandas as pd arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] t

我现在正在与Pandas多索引数据帧一起工作几周,我感觉我并没有真正理解GroupBy对象背后的直觉,尤其是对组的选择

让我们以这段代码为例:

import numpy as np
import pandas as pd

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

s = pd.Series(np.random.randn(8), index=index)
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)

df.groupby(level=0).first()
最后一行的输出如下:

            0         1         2         3
bar  1.612350 -0.019424 -0.088925 -0.188864
baz  2.752485 -1.011006  0.249788  1.106547
foo  1.313016  0.716512  0.550851 -1.532394
qux  1.505173  0.758075  1.360808  1.261204
            0         1         2         3
one  1.612350 -0.019424 -0.088925 -0.188864
two  0.434829  1.698503 -0.213425  0.329733
然而,在我看来,这种行为没有多大意义,因为它给了我第一组,就好像我会按第二级分组一样。我对上述代码的期望是:

            0         1         2         3
bar  1.612350 -0.019424 -0.088925 -0.188864
baz  2.752485 -1.011006  0.249788  1.106547
foo  1.313016  0.716512  0.550851 -1.532394
qux  1.505173  0.758075  1.360808  1.261204
            0         1         2         3
one  1.612350 -0.019424 -0.088925 -0.188864
two  0.434829  1.698503 -0.213425  0.329733
到目前为止,我通过这样做实现了我的目标:

list(df.groupby(level=0))[0][1]
但是,这看起来不像是注定要这样做的

不知何故,我似乎对GroupBy对象有错误的期望。也许有人能帮我解决我的困惑:)

其他信息:
我不是在寻找一个具体的解决方案,如何得到“第一组”,因为我已经通过创建一个列表的对象了。我的问题是关于对GroupBy对象的理解,以及为什么它选择第一个(或任何其他组)的方式

您的第一列是级别0,但您希望按级别1分组。如果重置索引,两列都将被分配一个列标题,您可以根据该标题进行分组

添加此代码:

df=df.reset_index()

df=df.groupby(['level_1']).first()
df.head()

您正在寻找多索引切片吗

df.loc[pd.IndexSlice['bar',:],:]
Out[319]: 
                0        1         2         3
bar one  0.807706  0.07296  0.638787  0.329646
    two -0.497104 -0.75407 -0.943406  0.484752

您可以为您的
多索引
级别命名,然后使用:

或者,使用:


因为我的问题是由@user2285236在评论中回答的,所以我尝试对其进行总结

方法
first()
不选择第一个组,而是选择每个组的第一个条目。没有类似于
list(df.groupby(level=0))[0][1]
的内置实现的原因是
groupby()
方法对条目进行排序

例如,让我们安排上面的示例,并将“第一”组设置为“qux”?。看起来是这样的:

arrays = [['qux', 'qux', 'bar', 'bar', 'baz', 'baz', 'foo', 'foo'],
          ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]

tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

s = pd.Series(np.random.randn(8), index=index)
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)
调用
list(df.groupby(level=0))[0][1]
返回:

                0         1         2         3
bar one -0.335708 -0.315253 -0.087970  0.754242
    two -1.608651  1.005786  1.800341 -1.059510 
而不是我所期望的“第一”组:

                0         1         2         3
qux one -0.374186  0.812865  0.578298 -0.901881
    two -0.137799  0.278797 -1.171522  0.319980

但是,可以使用内置方法
get\u group()
调用每个组。因此,在本例中,我可以通过调用:
df.groupby(level=0)。get_group('qux')

没有名字可以通过ilevel_0:-)来获取“first”组。哦,好提示!但是我喜欢名字:)我想你的误解与
first
方法的作用有关:它不选择第一组,而是选择每组中的第一项。@user2285236这正是我想要的答案:)。但是,我不明白为什么有一种方法可以获取每个组的第一个(或第n个)成员,而没有一种方法用于第n个组。是的,熊猫只允许按键选择组(如
df.groupby(level=0)。get_group('foo')
),这可能是因为默认情况下它不保留原始顺序并按键排序。您的密钥已经排序,因此您不会在
列表(df.groupby(level=0))[0][1]
中看到问题,但是如果您的第一组是
qux
,您将再次获得
bar
<代码>第n个组在这种情况下可能是不明确的,可能这就是为什么他们只允许通过键访问组。非常感谢,现在一切都有意义了!