У меня есть этот набор данных:
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