Pandas 表aggfunc/values参数行为异常

Pandas 表aggfunc/values参数行为异常,pandas,pivot-table,aggregate,Pandas,Pivot Table,Aggregate,我有以下数据集: np.random.seed(0) test = pd.DataFrame({ 'a' : np.random.randint(0, 10, size=(10,)), 'b' : np.random.randint(0, 10, size=(10,)), 'c' : np.random.randint(0, 10, size=(10,)), 'd' : np.random.randint(0, 10, size=(10,)), }) prin

我有以下数据集:

np.random.seed(0)

test = pd.DataFrame({
    'a' : np.random.randint(0, 10, size=(10,)),
    'b' : np.random.randint(0, 10, size=(10,)),
    'c' : np.random.randint(0, 10, size=(10,)),
    'd' : np.random.randint(0, 10, size=(10,)),
})

print(test)

   a  b  c  d
0  5  7  5  2
1  0  6  9  3
2  3  8  8  8
3  3  8  9  1
4  7  1  4  3
5  9  6  3  3
6  3  7  0  3
7  5  7  3  7
8  2  8  5  0
9  4  1  0  1
当我运行下面的代码时,我得到的列比我想象的多得多

tp = test.pivot_table(index=[
    'a',
], columns=[
    'b',
], values=[
    'c',
], aggfunc=[
    'nunique'
])

print(tp)

  nunique                                                       
        a                   b                   c               
b       1    6    7    8    1    6    7    8    1    6    7    8
a                                                               
0     NaN  1.0  NaN  NaN  NaN  1.0  NaN  NaN  NaN  1.0  NaN  NaN
2     NaN  NaN  NaN  1.0  NaN  NaN  NaN  1.0  NaN  NaN  NaN  1.0
3     NaN  NaN  1.0  1.0  NaN  NaN  1.0  1.0  NaN  NaN  1.0  2.0
4     1.0  NaN  NaN  NaN  1.0  NaN  NaN  NaN  1.0  NaN  NaN  NaN
5     NaN  NaN  1.0  NaN  NaN  NaN  1.0  NaN  NaN  NaN  2.0  NaN
7     1.0  NaN  NaN  NaN  1.0  NaN  NaN  NaN  1.0  NaN  NaN  NaN
9     NaN  1.0  NaN  NaN  NaN  1.0  NaN  NaN  NaN  1.0  NaN  NaN
我希望只得到
c
列的子集,而不是
a
b
列。如果我运行下一个代码:

tp1 = test.pivot_table(index=[
    'a',
], columns=[
    'b',
], values='c', aggfunc=[
    'nunique'
])

print(tp1)

  nunique               
b       1    6    7    8
a                       
0     NaN  1.0  NaN  NaN
2     NaN  NaN  NaN  1.0
3     NaN  NaN  1.0  2.0
4     1.0  NaN  NaN  NaN
5     NaN  NaN  2.0  NaN
7     1.0  NaN  NaN  NaN
9     NaN  1.0  NaN  NaN
我得到了我对前面代码的期望。如果我将
'nunique'
修改为
pd.Series.nunique
,也可以获得预期的输出:

tp2 = test.pivot_table(index=[
    'a',
], columns=[
    'b',
], values=[
    'c',
], aggfunc=[
    pd.Series.nunique
])

print(tp2)

  nunique               
        c               
b       1    6    7    8
a                       
0     NaN  1.0  NaN  NaN
2     NaN  NaN  NaN  1.0
3     NaN  NaN  1.0  2.0
4     1.0  NaN  NaN  NaN
5     NaN  NaN  2.0  NaN
7     1.0  NaN  NaN  NaN
9     NaN  1.0  NaN  NaN
问题: 这是虫子吗?还是有一些底层代码导致了这种情况?难道这三个版本的代码不应该产生相同的(除了列级别)输出吗

另一个示例使用不同的
aggfunc
当我运行类似的代码,但使用
count
而不是
nunique
时,每次都会得到预期的结果:

cp = test.pivot_table(index=[
    'a',
], columns=[
    'b',
], values=[
    'c',
], aggfunc=[
    'count'
])

cp2 = test.pivot_table(index=[
    'a',
], columns=[
    'b',
], values=[
    'c',
], aggfunc=[
    pd.Series.count
])

# both return the same thing
  count               
      c               
b     1    6    7    8
a                     
0   NaN  1.0  NaN  NaN
2   NaN  NaN  NaN  1.0
3   NaN  NaN  1.0  2.0
4   1.0  NaN  NaN  NaN
5   NaN  NaN  2.0  NaN
7   1.0  NaN  NaN  NaN
9   NaN  1.0  NaN  NaN

values='c'
给出了预期的输出。我知道。但不是
值=['c']
。我的问题是为什么
values=['c']
不能产生相同的输出。这是个好问题。我会在pandas github中打开一个问题,让开发者和维护者解释行为上的差异,就像一个bug一样,因为
a
b
不应该存在。深入研究代码,它显示
['c']
被视为多值,而
'c'
则不是。我记录了一个问题