質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

1回答

963閲覧

pandasを用いた集計表の作成

KroYuta

総合スコア0

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

1クリップ

投稿2020/10/14 13:59

編集2020/10/15 00:28

前提・実現したいこと

データが膨大なため、pandasを用いて、加工前データをもとに理想図のような集計表を作りたいです。また、その集計表を用いて、基礎統計量を計算したいです。
実際のデータは行数が750万件あり、Excelでは対応しきれないため、pandasで実現したいと考えています。

具体的には、加工前のカラム(ヘッダ)にある"状態"を、インデックス側に持ってくることで、理想図のような表を作り、集計したいです。(データ自体はダミーですが、レイアウトが同じです。)

  • 車の区分とは、車の大きさによって割り当てられたコードです。大きさでの割り振りなので、重複があります。
  • 各状態は、車の故障の種類です。数字は、故障の重度レベルです(数字が大きいほど重篤な故障)。
  • 社名は、修理に使った修理会社の名前です。数字は、サービスの利用回数です。

【加工前】
イメージ説明

【理想図】
イメージ説明

上記のような表を作成するためには、pandasでどのような操作を行えばよいか、ご教示いただけると幸いです。
恥ずかしながらpython,pandasはズブの素人で、自分の分かる範囲でcrosstabメソッドなどを試しましたが、ほしい表が出力されません。
必ずしも一発で上の表を出す必要はなく、別個に計算してマージなどでも構いません。
最終的に理想図の表が完成すればよい、というイメージです。

発生している問題・エラーメッセージ

いまのところ、"状態"と"社名"を表す上位のヘッダをもう一つ追加して(マルチカラム)、stackメソッドを行えばよいかと思っていますが、手元で再現できていません。
pythonの問題というより、統計の浅学が影響しているかもしれませんが、上記のような表の作成について、解決方法がありましたらご教示いただけると幸いです。

エラーメッセージ 特にございません。

該当のソースコード

ソースコード 特にございません。

試したこと

  • stackメソッドによる列から行への移動。全体が行側にピボットしてしまいました。
  • マルチカラムに加工してからstackする。マルチカラムに加工する時点で、手間取っています。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。![イメージ説明]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/10/14 22:39

どのぐらいの量のデータか分かりませんが、Excelのピボットテーブル機能である程度実現出来ませんか?
KroYuta

2020/10/15 00:18 編集

ご質問ありがとうございます。 実際のデータは行数が750万件あり、EXCELのピボットテーブルでは読み込みきらず、対処しきれない量となってしまっています。 pandasでEXCELのピボットテーブルを模倣できればと考えています。
meg_

2020/10/15 00:20

> 実際のデータは行数が750万件あり そうなんですね。その情報も質問に追記した方が良いと思います。
KroYuta

2020/10/15 00:28

ありがとうございます。 質問文にも追記させていただきました。
toast-uz

2020/10/15 03:51

理想図のインデックスは3階層にした方が、加工前の情報を使いやすいです。 状態1:パンク と 0 で別階層にするイメージです。
KroYuta

2020/10/17 10:20

ありがとうございます。 故障内容とレベルを別立てにする方が作りやすいのですね。 参考になります。
guest

回答1

0

以下の手順で、ご希望の形は作ることはできましたが、750万行でちゃんと動くかはわかりません。

各ステップで、データフレームがどういう形になっているか確認すれば、何をやっているかわかると思います。

python

1from io import StringIO 2import pandas as pd 3 4csv = StringIO('''\ 5シリアルナンバー,車の区分コード,状態1:パンク,状態2:ライト切れ,状態3:エンジン停止,状態4:オイル漏れ,A社,B社,C社 61,10,1,0,4,2,3,1,3 72,21,3,0,0,3,1,4,2 83,20,4,1,0,4,1,0,4 94,22,0,0,3,0,1,0,0 105,11,4,3,0,2,2,4,1 116,11,2,3,1,2,2,4,1 127,21,0,4,0,1,0,2,2 138,30,0,2,2,3,0,3,0 149,22,1,3,4,3,0,2,1 1510,10,1,2,3,1,4,3,2 1611,20,1,0,4,0,3,0,0 1712,21,1,2,1,0,1,0,3 18''') 19df = pd.read_csv(csv, index_col=0)

python

1# 状態1~4を縦持ちに変換 (それぞれ個別で集計するため) 2df2 = df.melt(id_vars=['車の区分コード', 'A社', 'B社', 'C社'], value_vars=['状態1:パンク', '状態2:ライト切れ', '状態3:エンジン停止', '状態4:オイル漏れ']) 3 4# 縦持ちにしたものを一つの列に結合 5df2['状態'] = df2.variable + df2.value.astype(str) 6 7# 集計実行 8df3 = df2.groupby(['車の区分コード', '状態'])[['A社', 'B社', 'C社']].sum() 9 10# 合計、平均、偏差、中央値の計算 11total = df3.sum(axis=1).rename('合計') 12average = df3.mean(axis=1).rename('利用者平均') 13stdev = df3.std(axis=1, ddof=0).rename('利用者標準偏差') 14median = df3.median(axis=1).rename('利用者中央値') 15 16# 一つのデータフレームに結合 17df4 = pd.concat([total, df3, average, stdev, median], axis=1) 18 19# インデックスをすべての組み合わせにする 20new_index = pd.MultiIndex.from_product(df4.index.levels) 21df5 = df4.reindex(new_index, fill_value=0)

投稿2020/10/16 00:40

bsdfan

総合スコア4794

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KroYuta

2020/10/25 08:43

回答ありがとうございます! ご返信できておらず失礼いたしました。 掲載いただいたコードを実行したところ、データ数が多いため少し時間はかかりましたが無事結果が出力できました。 大変助かりました。 誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問