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'
则不是。我记录了一个问题