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

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

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

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

pandas

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

Q&A

1回答

581閲覧

pandasの処理時間短縮

stsyco

総合スコア11

Python

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

pandas

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

0グッド

0クリップ

投稿2020/01/02 07:35

編集2022/01/12 10:55

前提・実現したいこと

pandasの処理時間を短縮したいです。

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

for文を使わずにmap関数を使う事で短縮できるとネットで見かけましたが、実装方法がわからず悩んでおります。又、map関数以外でも良い方法がありましたらアドバイスを頂けないでしょうか。よろしくお願い致します。

該当のソースコード

↓sample.csvから必要項目を取得し、一つのデータフレームにまとめている。

python3

1import csv 2import pandas as pd 3import re 4import traceback 5 6# sample.csvは実際は数千個あります 7csv_list = [ "sample.csv", "sample.csv", "sample.csv"] 8 9columns = ['date', 'code', 'market', 'industry', 'name', 'start', "end", "low", "high", "volume"] 10df = pd.DataFrame(columns=columns) 11 12array = [] 13count = 1 14 15for i in csv_list: 16 csv = pd.read_csv(i, encoding='cp932',index_col=None) 17 for i in range(len(csv)-1): 18 try: 19 title = csv.columns[0] 20 # date 21 date = csv.index[count] 22 # code 23 code = title[:4] 24 # market 25 market = "" 26 if "東証1部" in title: 27 market = "東証1部" 28 elif "東証2部" in title: 29 market = "東証2部" 30 elif "マザーズ" in title: 31 market = "マザーズ" 32 elif "JQ" in title: 33 market = "ジャスダック" 34 elif "東証ETF" in title: 35 market = "東証ETF" 36 # industry 37 industry_pattern = r"\(.*" 38 industry_text = str(title) 39 industry_matchobj = re.search(industry_pattern, industry_text) 40 industry = industry_matchobj.group()[1:-1] 41 # name 42 name_pattern = r"(.*\(" 43 name_text = str(title) 44 name_matchobj = re.search(name_pattern, name_text) 45 if name_matchobj is None: 46 name = title.split(" ")[2] 47 else: 48 name = name_matchobj.group()[:-1] 49 # start 50 start = csv.iloc[count, 0] 51 # end 52 end = csv.iloc[count, 1] 53 # low 54 low = csv.iloc[count, 2] 55 # high 56 high = csv.iloc[count, 3] 57 # volume 58 volume = csv.iloc[count, 4] 59 # df 60 array.extend([date, code, market, industry, name, start, end, low, high, volume]) 61 series = pd.Series(array, index=df.columns) 62 df = df.append(series, ignore_index=True) 63 count += 1 64 array = [] 65 except Exception as e: 66 print(traceback.format_exc()) 67 break 68 # count初期化 69 count = 1 70

↓sample.csv
(書式は全ファイル同様で行数、セルの値のみが各々のファイルで異なっております)
sample.csv 例1
イメージ説明
sample.csv 例2
イメージ説明
sample.csv 例3
イメージ説明

処理後のデータフレーム
イメージ説明説明](ad95200e5a6b5d1d2e90777b5db6d9c8.png)

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

python3
pandas

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

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

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

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

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

hayataka2049

2020/01/02 08:01 編集

csvファイルはエクセルのスクショではなくテキストフォーマットに差し替えておいてください。数千個とはいいませんが、2つか3つ示してください。
meg_

2020/01/02 09:23

処理後のデータフレームも見せてください。
stsyco

2020/01/02 11:29

追記致しました。不備がありましたらご指摘ください。 よろしくお願い致します。
guest

回答1

0

このような方法もあります。
※sample.csv 例1で試してみましたので、実際のデータでは不具合が発生するかもしれません。
※列名の順番は適当です。必要であればそちらで並べ替えてください。

Python

1import pandas as pd 2import re 3 4df_title = pd.read_csv('test79.csv', header=None, nrows=1) 5 6s = df_title[0].values.tolist()[0].split(' ') 7code = s[0] 8 9if "東証1部" in s[1]: 10 market = "東証1部" 11elif "東証2部" in s[1]: 12 market = "東証2部" 13elif "マザーズ" in s[1]: 14 market = "マザーズ" 15elif "JQ" in s[1]: 16 market = "ジャスダック" 17elif "東証ETF" in s[1]: 18 market = "東証ETF" 19 20industry_pattern = r"\(.*" 21industry_text = str(s[2]) 22industry_matchobj = re.search(industry_pattern, industry_text) 23industry = industry_matchobj.group()[1:-1] 24 25df = pd.read_csv('test79.csv', skiprows=1) 26df['code'] = code 27df['market'] = market 28df['industry'] = industry 29df['name'] = s[2] 30 31df = df.rename(columns={'日付':'date','始値':'start','高値':'high','安値':'low','終値':'end','出来高':'volume'}) 32df = df.drop('終値調整値', axis=1)

forループを使用する場合でも、「code、market、industry、name」は1回の処理でOKですので無駄にループ処理しないようにしましょう。

投稿2020/01/02 12:49

meg_

総合スコア10577

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

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

stsyco

2020/01/03 03:35

アドバイス頂き誠に有り難う御座います。 csvの書式に合わせ2回に分け読み込む点、不用意にforループしない点大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問