やりたい事
df-Aをdf-Bのように集計したい。
- df-A(契約ごとの明細データ)
日本語名 | 項目名 | データ型 | 項目値 |
---|---|---|---|
申込番号 | mno | 数値 | - |
支社 | sya | 数値 | - |
営業所 | kan | 数値 | - |
金額 | kinngaku | 数値 | 契約した金額を保持 |
契約者性 | ksex | 数値 | 0:男性 1:女性 |
契約経路 | keiro | 数値 | 0:新規 1:見直し |
- df-B(支社、営業所ごとに各種項目を集計)
日本語名 | 項目名 | データ型 | 項目の組成 |
---|---|---|---|
支社 | sya | 数値 | =支社 |
営業所 | kan | 数値 | =営業所 |
金額 | kinngaku | 数値 | 金額を集計する。 |
金額_男性 | kinngaku_man | 数値 | 契約者性=0のレコードの金額を集計する。 |
金額_女性 | kinngaku_woman | 数値 | 契約者性=1のレコードの金額を集計する。 |
金額_男性_新規 | kinngaku_man_sin | 数値 | 契約者性=0,契約経路=0のレコードの金額を集計する。 |
金額_男性_見直し | kinngaku_man_mina | 数値 | 契約者性=0,契約経路=1のレコードの金額を集計する。 |
金額_女性_新規 | kinngaku_woman_sin | 数値 | 契約者性=1,契約経路=0のレコードの金額を集計する。 |
金額_女性_見直し | kinngaku_woman_mina | 数値 | 契約者性=1,契約経路=1のレコードの金額を集計する。 |
知りたい事
- aggを利用した際、引数に複数列を渡す方法
→集計列以外の列を条件に利用する方法が分からず。
複数項目を異なる条件で集計できるが、ユーザー定義関数を用いても引数は1列しか渡せない?
(「金額_男性」「金額_女性」といった集計は不可?)
- applyを利用した際に、複数項目を異なる条件で同時に集計する方法
→データフレームを引数として渡せるので、集計列と条件列を分けることができるが、複数項目を異なる条件で同時に集計できない
(「金額_男性」「金額_女性」を同時に集計することは不可?)
- あるいはもっと効率的にやりたいことを実現できる方法
試したこと
- agg
→ 検索等行ったものの情報が見つからず、異なる引数の渡し方が分からず。。
- apply
→同一のデータフレームに対して、groupbyと同時に複数回applyを掛ける。⇒エラー
``` python
def udf_kingaku_man(df):
return df.query('ksex==1')['kingaku'].sum()
def udf_kingaku_woman(df): return df.query('ksex==2')['kingaku'].sum() df_group = df.groupby(['sya','kan']).apply(udf_kingaku_man).apply(udf_kingaku_woman).reset_index()
* 集計したい項目ごとに、同一のデータフレームにgroupby+applyを掛け、異なるデータフレームを作成したのち、必要列のみコンカチ。⇒実現できるが冗長? ``` python df_group1 = df.groupby(['sya','kan']).apply(udf_kingaku_man).reset_index() df_group2 = df.groupby(['sya','kan']).apply(udf_kingaku_woman).reset_index() # 列除外は省略 df_group = pd.concat([df_group1, df_group2], axis=1)
※初心者マークを付加
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/17 12:18