Панды: выбор значений массива с помощью [columnname] [rownumber] просто работает для мультииндексов - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь анализировать данные с помощью сводных таблиц, используя Pandas.

Для мультииндексов все работает нормально.

У меня есть эта сводная таблица:

>>>print(pivtab)
           count  win
pp   ps              
8000 8200      4    2
8100 8200      2    1
     8300      3    1

Теперь я могу выбрать, например, значение во 2-й строке в столбце «count» с помощью

>>>print(pivtab["count"][1])
2

Неожиданное поведение возникает при использовании только одной сводной таблицы индекса. Сводная таблица выглядит следующим образом:

      count  win
pp              
8000      4    2
8100      5    2 

Теперь, когда я пытаюсь использовать то же самое с print(pivtab["count"][1]) Я получаю KeyError: 1. Кажется, что Python теперь принимает не номер строки, а имя строки (= индекс). С

>>>print(pivtab["count“][8100])
5

все отлично работает.

Полный код выглядит так:

import pandas as pd
columns = ["count","game_Id","season","win","pp","ps"]
matrix = pd.DataFrame(columns=columns)
# Create a test matrix
for i in range(1,10):
    win = 0
    if int(i/2) == i/2:
        win = 1
    pprim = 8000
    if i > 4:
        pprim = 8100
    psub = 8200
    if i > 6:
        psub = 8300
    new_row = pd.DataFrame([[1, i, 11, win, pprim, psub]], columns=columns)
    matrix = matrix.append(new_row,ignore_index=True)
print(matrix)
pivtab = pd.pivot_table(matrix, index=["pp","ps"], values=["count","win"], aggfunc="sum")
print("\n", pivtab)
print(pivtab["count"][1])

Чтобы полностью запутаться, я попробовал другую тестовую матрицу ... и тут все отлично работает!

import pandas as pd
matrix = pd.DataFrame({"A":["hey","hey","boo","boo"], "B":[1,2,3,2], "valueA":[123,441,190,123], "valueB":[5,5,6,6]})
piv_matrix = pd.pivot_table(matrix, index=["A"], values=["valueA","valueB"], aggfunc="sum")
print(piv_matrix)
print("\nValue:", piv_matrix["valueA"][1])

Результат:

     valueA  valueB
A                  
boo     313      12
hey     564      10

Value: 564

Я был бы рад, если бы вы объяснили мне причину этого неожиданного (по крайней мере для меня) поведения. Спасибо!

1 Ответ

0 голосов
/ 01 июля 2018

Не рекомендуется из документации

Документация не поощряет цепная индексация. Синтаксис df[label_1][label_2] не должен использоваться.

Альтернатива

Большинство решений включают loc / iloc для нарезки по меткам / позициям или at / iat для доступа к скалярам.

В ваших примерах вы смешиваете индексаторы на основе меток и позиций. Вместо этого вы можете выбрать серию и использовать iat или iloc:

piv_matrix['valueA'].iat[1]
piv_matrix['valueA'].iloc[1]

Этот синтаксис будет работать для обоих ваших примеров.

...