Вставьте% от общей стоимости в сводную таблицу в пандах - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть 3 компании A, B и C и их данные о продажах за каждый квартал 2018 года, разделенные на категории компьютеров и принтеров.

df = pd.DataFrame({"Fiscal Quarter": ["FY18-Q1", "FY18-Q1", "FY18-Q1", "FY18-Q1", "FY18-Q1", "FY18-Q1",
                                      "FY18-Q2", "FY18-Q2", "FY18-Q2", "FY18-Q2", "FY18-Q2", "FY18-Q2",
                                      "FY18-Q3", "FY18-Q3", "FY18-Q3", "FY18-Q3", "FY18-Q3", "FY18-Q3",
                                      "FY18-Q4", "FY18-Q4", "FY18-Q4", "FY18-Q4", "FY18-Q4", "FY18-Q4"],
                   "Company": ["A", "A", "B", "B", "C", "C",
                               "A", "A", "B", "B", "C", "C",
                               "A", "A", "B", "B", "C", "C",
                               "A", "A", "B", "B", "C", "C"],
                   "Category": ["Computers", "Printers", "Computers", "Printers", "Computers", "Printers",
                                "Computers", "Printers", "Computers", "Printers", "Computers", "Printers",
                                "Computers", "Printers", "Computers", "Printers", "Computers", "Printers",
                                "Computers", "Printers", "Computers", "Printers", "Computers", "Printers"],
                   "Sales": [300, 350, 1000, 700, 2500, 2800,
                             450, 200, 1100, 720, 2400, 2100,
                             600, 330, 850, 1200, 2400, 2000,
                             520, 400, 900, 700, 2000, 2200]})

https://github.com/currentlyunknown/sampledata/blob/master/sampledata.csv

Я хотел бывоспринимайте «значения» не только как продажи в долларах США для каждой компании, но и как сравнение в% к общему объему продаж за квартал (A + B + C), например, для компании A:

               FY18-Q1          FY18-Q2
Computers      300              450
Printers       350              400

Желаемый результат будет выглядеть примерно так:

               FY18-Q1          FY18-Q2
Computers      300              450
               30%              40%
Printers       350              400
               25%              27%

До сих пор я готовил df со столбцом ['% of Total'] для каждой компании, используя это:

total = df.groupby(['Fiscal Quarter', 'Category']).sum().rename(columns={"Sales": "Total Sales"})

df = df.merge(total, on=['Fiscal Quarter', 'Category'])

df['% of Total'] = (df['Sales'] / df['Total Sales'])

df = df.drop(['Total Sales'], axis=1)

Я создаю сводные таблицы для просмотра данных о продажах каждой компании в отдельности:

dfa = df[df['Company']=='A']

A = pd.pivot_table(
    dfa,
    index=['Category'],
    columns=['Fiscal Quarter'],
    values=['Sales', '% of Total'],
    aggfunc=np.sum
    ).reset_index()

A.columns = A.columns.droplevel([0])
A = A.reset_index().rename_axis(None, axis=1)

Но я получаю:

               FY18-Q1          FY18-Q2          FY18-Q1          FY18-Q2
Computers      300              450              30%              40%
Printers       350              400              25%              27%

Теперь, как мне это сделать?Я поворачиваю его нужным образом?

1 Ответ

0 голосов
/ 06 апреля 2019
  1. Рассчитать общую сумму в копии таблицы (сгруппировать + сумма)
  2. Объединение двух таблиц по названию компании (вы получите дополнительный столбец общих продаж)
  3. Рассчитать% между общей продажей и точной продажей Q
  4. Pivot
...