前提・実現したいこと
次のようなCSVファイルが複数あり、アルファベットが振られた列名は左端のAの項目以外、CSVファイルによってまちまちで数十項目あります。
CSVその1
|Aの量|Aの項目1|Aの項目2|Bの量|Bの項目1|Tの量|Tの項目1|Tの項目2|Tの項目3|
|:--|:--:|--:|
| |||
CSVその2
|Aの量|Aの項目1|Aの項目2|Eの量|Gの量|Gの項目1|
|:--|:--:|--:|
| |||
このようなCSVファイルについて、それぞれの項目の割合を計算しようとしています。
CSVその1計算後
|Aの量|Aの項目1|...|Aの量の割合|Bの量の割合|Tの量の割合|
|:--|:--:|--:|
| | | | | | | 100xA/(A+B+T) | 100xB/(A+B+T) | 100xT/(A+B+T) |
該当のソースコード
考えついたのは列を読み込むたびに例外処理を行っていくというものです。
実際にはCSVファイルは複数あるのでosモジュールでCSVファイル名のリストを取得し、for文を用いてファイル名を次々代入して処理していますが省略しています。
import pandas as pd df = pd.read_csv("hoge.csv") vol_a = df["Aの量"] # 項目ごとに量を取り出す vol_sum = vol_a try: vol_b = df["Bの量"] vol_sum += vol_b except: pass try: vol_c = df["Cの量"] vol_sum += vol_c except: pass (以下省略) # 各量の割合を計算する df["Aの量の割合"] = vol_a / vol_sum try: df["Bの量の割合"] == vol_b / vol_sum except: pass (以下省略)
しかし、列の項目数が全部で100近くあり、できればもっと簡潔に書けないかと考えています。
試したこと
- 複数の処理にまとめて例外処理を行う
- 条件に一致する(列名に「量」を含む)列だけを取り出して計算する
のどちらかができればと考えているのですが、どちらの方法についても検索しても目的の内容がヒットしませんでした。
上記の内容に限らず、上手い書き方がありましたらご教示いただければ幸いです。
補足情報(FW/ツールのバージョンなど)
Python 3.8.5
Pandas 1.2.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/02/06 15:58