1. ホーム
  2. パイソン

[解決済み】Pandasのgroupbyを使ったパーセント表示について

2022-04-08 11:39:19

質問

これは明らかに簡単なことなのですが、numpyの初心者として行き詰まっています。

州、オフィスID、オフィスの売上高の3つの列を含むCSVファイルを持っています。

ある州のオフィスごとの売上比率を計算したい(各州の全比率の合計が100%)。

df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
                   'office_id': range(1, 7) * 2,
                   'sales': [np.random.randint(100000, 999999)
                             for _ in range(12)]})

df.groupby(['state', 'office_id']).agg({'sales': 'sum'})

これが返ってくる。

                  sales
state office_id        
AZ    2          839507
      4          373917
      6          347225
CA    1          798585
      3          890850
      5          454423
CO    1          819975
      3          202969
      5          614011
WA    2          163942
      4          369858
      6          959285

に手を伸ばす方法がわからないようです。 state のレベル groupby を合計すると sales を使用します。 state を計算し、分数を算出します。

解き方は?

ポール・Hの回答 を作る必要があるのはその通りです。 groupby オブジェクトがありますが、もっと簡単な方法でパーセンテージを計算することができます。 groupby その state_office を分割し sales の列をその合計で割る。ポールHの答えの冒頭をコピーする。

# From Paul H
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
                   'office_id': list(range(1, 7)) * 2,
                   'sales': [np.random.randint(100000, 999999)
                             for _ in range(12)]})
state_office = df.groupby(['state', 'office_id']).agg({'sales': 'sum'})
# Change: groupby state_office and divide by sum
state_pcts = state_office.groupby(level=0).apply(lambda x:
                                                 100 * x / float(x.sum()))

を返します。

                     sales
state office_id           
AZ    2          16.981365
      4          19.250033
      6          63.768601
CA    1          19.331879
      3          33.858747
      5          46.809373
CO    1          36.851857
      3          19.874290
      5          43.273852
WA    2          34.707233
      4          35.511259
      6          29.781508