Замена тега «total» на тег «other» путем извлечения различий из строк в Pandas - PullRequest
0 голосов
/ 10 сентября 2018

В настоящее время у меня есть кадр данных, который выглядит следующим образом:

 account     region     measure     value     date
 acct1       USA        Expense     100       1/31/2019
 acct1       USA        Sales       150       1/31/2019
 acct2       USA        Expense     1000      1/31/2019
 acct2       USA        Sales       1500      1/31/2019
 acct2       East       Expense     500       1/31/2019
 acct2       East       Sales       800       1/31/2019
 acct1       West       Expense     90        1/31/2019
 acct1       West       Sales       140       1/31/2019
 acct2       West       Expense     450       1/31/2019
 acct2       West       Sales       500       1/31/2019

Существуют учетные записи и регионы, связанные с датами, мерами и значениями.

Даже если тег региона СШАВ общем, восточные и западные регионы не обязательно составляют общую сумму США.Моя цель состоит в том, чтобы изменить строки «США» на тег «Другие», который позволяет объединить теперь три региона с предыдущими числами «США».

Итак, это будет выглядеть следующим образом:

 account     region     measure     value     date
 acct1       Other      Expense     10        1/31/2019
 acct1       Other      Sales       10        1/31/2019
 acct2       Other      Expense     50        1/31/2019
 acct2       Other      Sales       200       1/31/2019
 acct2       East       Expense     500       1/31/2019
 acct2       East       Sales       800       1/31/2019
 acct1       West       Expense     90        1/31/2019
 acct1       West       Sales       140       1/31/2019
 acct2       West       Expense     450       1/31/2019
 acct2       West       Sales       500       1/31/2019

Как видите, регионы "Восток" и "Запад" не изменились, и все три суммируют до итогов "США" ранее.

Я пробовал несколько различныхСпособ достижения этого безрезультатен.Сначала я попытался выделить три df для каждого региона:

 df_usa = df[df['region'] == 'USA']
 df_east = df[df['region'] == 'east']
 df_west = df[df['region'] == 'west']

Затем создать «другое» df и вычесть на основе столбца:

 df_usa['value'] = df_usa['value'] - df_east['value'] - df_west['value']

Это не работает, так как каждый регионУ df разное количество аккаунтов / строк.Мне также нужно будет учесть дополнительные даты в наборе данных.

Как я уверен, вы можете сказать, что я все еще новичок в вычислениях панд.

1 Ответ

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

Работать с вашими данными немного проще, если вы немного изменили форму. Во-первых, перемещение идентифицирующих элементов в индекс, а областей - в столбцы, проясняет, что и с чем:

In [46]: regions = df.set_index(["account", "region", "measure", "date"]).sort_index().unstack(1)

In [47]: regions.columns = regions.columns.droplevel()

In [48]: regions
Out[48]:
region                      East     USA   West
account measure date
acct1   Expense 1/31/2019    NaN   100.0   90.0
        Sales   1/31/2019    NaN   150.0  140.0
acct2   Expense 1/31/2019  500.0  1000.0  450.0
        Sales   1/31/2019  800.0  1500.0  500.0

В этой форме достаточно просто создать другое поле:

In [49]: regions['Other'] = (regions['USA'] * 2) - regions.sum(axis=1)

In [50]: regions
Out[50]:
region                      East     USA   West  Other
account measure date
acct1   Expense 1/31/2019    NaN   100.0   90.0   10.0
        Sales   1/31/2019    NaN   150.0  140.0   10.0
acct2   Expense 1/31/2019  500.0  1000.0  450.0   50.0
        Sales   1/31/2019  800.0  1500.0  500.0  200.0

Затем вы можете продолжить работу с ним в этом формате, или вы можете перенастроить вещи, чтобы вернуться к исходной форме:

In [51]: regions.drop("USA", axis=1).stack().reset_index().rename(columns={0: 'value'})
Out[51]:
  account  measure       date region  value
0   acct1  Expense  1/31/2019   West   90.0
1   acct1  Expense  1/31/2019  Other   10.0
2   acct1    Sales  1/31/2019   West  140.0
3   acct1    Sales  1/31/2019  Other   10.0
4   acct2  Expense  1/31/2019   East  500.0
5   acct2  Expense  1/31/2019   West  450.0
6   acct2  Expense  1/31/2019  Other   50.0
7   acct2    Sales  1/31/2019   East  800.0
8   acct2    Sales  1/31/2019   West  500.0
9   acct2    Sales  1/31/2019  Other  200.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...