Суммы и суммы панд с использованием выборок loc или iloc на мультиндексе - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь обновить эту таблицу 1 (уровень I, уровень II и уровень III), используя pandas iloc или loc с набором данных, указанным ниже.Я открыт для лучшего способа, чем loc и iloc, если есть предложения.

Таблица 1

enter image description here

Пример 1

Если я хочу обновить таблицу с новой информацией для выбора 1102 для уровня оплаты 13 и уровня III, я бы использовал следующий код pd.loc:

jobseries = '1102'
result = df.loc[('3',jobseries),'13']
print (result)
14.0

Пример 2: Это тоже работает.

jobseries = '1102'
result = df.loc[('3',jobseries),'13'].sum()
print (result)
14

Однако проблема в том, когда мне нужно выбрать несколько индексов или несколько столбцов.

MULTIPLE ROWS

Теперь, если я хочу обновить Таблицу 1, Итого по всем уровням I, вместо того, чтобы делать какой-то тип df.isin, мне нужно сделать следующее:

Пример 3:

total = df.loc[('1',jobseries),'07'] + df.loc[('1',jobseries),'09'] + and so on...
print (total)
32

Это работает, но я полагаю, что в конечном итоге будет выбрано значение RuntimeWarning: неверное, встречающееся в long_scalars.Так что это не лучший способ сделать это.Любые рекомендации?

НЕСКОЛЬКО КОЛОНН

Теперь, если я хочу обновить Таблицу 1, # сертификаты для Уровня I, Уровня II и Уровня III, а также для любого данного классауровень, я не могу понять код.Я пробовал следующее, но его выбрасывание ключевой ошибки.Я пробовал несколько способов сделать это и до сих пор не могу понять:

Пример 4:

jobseries = '1102'
result = df.loc[('1','2','3',jobseries),'All']
print (result)
KeyError: "None of [[('1', '2', '3', '1102')]] are in the [index]"

Это странно, потому чтоесли я проверяю свой индекс, keyError смущает меня.

df.index:

MultiIndex(levels=[['1', '2', '3', 'All'], ['', '0301', '0341', '0342', '0343', '0501', '0560', '0810', '0850', '1101', '1102', '1105', '1106', '1109', '1145', '1146', '1170', '1410']],
           labels=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3], [2, 3, 4, 6, 7, 9, 10, 11, 12, 13, 16, 17, 2, 8, 9, 10, 11, 1, 3, 4, 5, 9, 10, 11, 14, 15, 16, 0]],
           names=['Level', 'JobSeries'])

Я также пробовал df.xs:

Пример 5:

jobseries = '1102'
result = df.xs(jobseries, level=1)
print (result)

        01   07   08   09   11    12    13   14   15  All
Level                                                    
1      1.0  0.0  0.0  9.0  8.0   9.0   6.0  0.0  0.0   15
2      0.0  0.0  0.0  4.0  6.0  12.0   6.0  1.0  0.0   13
3      1.0  0.0  0.0  0.0  1.0  11.0  14.0  9.0  3.0   14

ИЗМЕНЕНИЯ В СТРОКАХ ИЛИ КОЛОННАХ

Другая проблема состоит в том, что если набор данных изменяется, а индекс или строки изменяют pd.loc и pd.iloc выдаетключевая ошибка.Есть ли что-нибудь вокруг этого?

df:

                 01   07   08    09    11    12    13   14   15  All
Level JobSeries                                                      
1     0341       0.0  0.0  0.0   0.0   0.0   1.0   0.0  0.0  0.0    1
      0342       0.0  0.0  1.0   0.0   0.0   0.0   0.0  0.0  0.0    1
      0343       0.0  0.0  0.0   0.0   0.0   2.0   0.0  0.0  0.0    2
      0560       0.0  0.0  0.0   1.0   0.0   0.0   0.0  0.0  0.0    1
      0810       0.0  0.0  0.0   0.0   1.0   0.0   0.0  0.0  0.0    1
      1101       0.0  0.0  0.0   0.0   0.0   1.0   0.0  0.0  0.0    1
      1102       1.0  0.0  0.0   9.0   8.0   9.0   6.0  0.0  0.0   15
      1105       0.0  7.0  3.0   5.0   0.0   0.0   0.0  0.0  0.0    9
      1106       0.0  2.0  0.0   0.0   0.0   0.0   0.0  0.0  0.0    2
      1109       0.0  0.0  0.0   0.0   2.0   0.0   0.0  0.0  0.0    2
      1170       0.0  0.0  0.0   0.0   1.0   2.0   0.0  0.0  0.0    3
      1410       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
2     0341       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
      0850       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
      1101       0.0  0.0  0.0   0.0   0.0   0.0   1.0  1.0  0.0    2
      1102       0.0  0.0  0.0   4.0   6.0  12.0   6.0  1.0  0.0   13
      1105       0.0  0.0  1.0   0.0   0.0   0.0   0.0  0.0  0.0    1
3     0301       0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0  1.0    1
      0342       0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0  1.0    1
      0343       0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0  1.0    1
      0501       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
      1101       0.0  0.0  0.0   0.0   0.0   0.0   2.0  1.0  0.0    2
      1102       1.0  0.0  0.0   0.0   1.0  11.0  14.0  9.0  3.0   14
      1105       0.0  1.0  0.0   0.0   0.0   0.0   0.0  0.0  0.0    1
      1145       0.0  0.0  0.0   0.0   0.0   0.0   1.0  0.0  0.0    1
      1146       0.0  0.0  0.0   0.0   0.0   0.0   0.0  1.0  0.0    1
      1170       0.0  0.0  0.0   0.0   0.0   1.0   1.0  0.0  0.0    2
All              2.0  8.0  4.0  11.0  11.0  14.0  15.0  9.0  4.0   17

Ссылка:

pd.loc: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html

pd.xs: https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.DataFrame.xs.html

pd.iloc: https://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer

1 Ответ

0 голосов
/ 27 сентября 2018

Я не совсем ясен по запросу, но будет

df.groupby(df.index).count()[13] или df.groupby(df.index).sum()[13] для столбца, или

df.groupby(['Level','JobSeries']).sum().loc[1,341] для строки

выполнить то, что вы ищете?Аргумент level в groupby предназначен для решения многоиндексных проблем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...