pandas pivot_table aggfunc / значения параметров ведут себя странно - PullRequest
5 голосов
/ 18 октября 2019

У меня есть этот набор данных:

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
...