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/