Python版本:3.5.2;熊猫版:0.23.1

当我使用两个索引进行分组时,我注意到意外的行为,但是每行在第一个索引上都是唯一的。我在带有列c的数据框中执行的代码是:

df.c.groupby(df.index.names).min()


当行在第一个索引上不是唯一时,一切都会按预期进行。为了清楚起见,我在下面提供了两个版本。编辑:现在包括三个版本!

版本1:具有预期的输出

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [1, 2, 4]], columns=['a', 'b', 'c'])
df = df.set_index(['a','b']).sort_index()


输入:

     c
a b
1 2  3
  2  4
4 5  6


输出:

a  b
1  2    3
4  5    6


版本2:具有意外的输出

df = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
df = df.set_index(['a','b']).sort_index()


输入:

     c
a b
1 2  3
4 5  6


输出:

a    3
b    6


预期产量:

a  b
1  2    3
4  5    6


版本3:具有预期的输出,但考虑到版本2则没有预期。

df = pd.DataFrame([[1, 2, 3, 4], [4, 5, 6, 7]], columns=['a', 'b1', 'b2', 'c'])
df = df.set_index(['a','b1','b2']).sort_index()


输入:

         c
a b1 b2
1 2  3   4
4 5  6   7


输出:

a  b1  b2
1  2   3     4
4  5   6     7

最佳答案

这是正在发生的事情。看一下传递给“应用的”函数f的系列的名称。

在第一种情况下(预期结果):

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [1, 2, 4]], columns=['a', 'b', 'c'])
df = df.set_index(['a','b']).sort_index()

def f(x):
    print(x)
    print('\n')
    print(min(x))
    print('\n')
    return min(x)
df.c.groupby(['a','b']).apply(f)


输出:

a  b
1  2    3
   2    4
Name: (1, 2), dtype: int64


3


a  b
4  5    6
Name: (4, 5), dtype: int64


6


Out[292]:

a  b
1  2    3
4  5    6


在第二种情况下(意外结果),请注意传入的系列名称:

df1 = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
df1 = df1.set_index(['a','b']).sort_index()
def f(x):
    print(x)
    print('\n')
    print(min(x))
    print('\n')
    return min(x)
df1.c.groupby(['a','b']).apply(f)


输出:

a  b
1  2    3
Name: a, dtype: int64


3


a  b
4  5    6
Name: b, dtype: int64


6


Out[293]:

a    3
b    6
Name: c, dtype: int64


它使用这些系列来构建结果数据框。由于数据的性质,该系列的命名是罪魁祸首。为什么?好吧,我们将不得不研究代码。

解决此问题的惯用方法是使用以下语法:

df1.groupby(df1.index.names)['c'].min()


输出:

a  b
1  2    3
4  5    6
Name: c, dtype: int64

关于python - Pandas groupby multiindex在第一级唯一时:意外结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53382065/

10-12 18:01