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

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

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

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

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

解決済

算出結果を、for文で回しながら、新しいデータフレームの新たな列に追加する

goichi
goichi

総合スコア16

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

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

2回答

0評価

0クリップ

300閲覧

投稿2022/01/23 15:04

#課題
Colaboratoryで、データを集めやすい市場・競馬等のデータを収集して、参考になるコードを試しながら、Pythonの勉強をしています。
現在、データの処理結果を、データフレームの新しい列に追加する処理で苦戦しています。
色々試しましたが、自身の力が不足しており、どうしても解決できませんでした。
恐れ入りますが、初学者なこともあり、どのようなコードを、どこに入れればよいのか、ご教示いただきたくお願い申し上げる次第です。

#実現したいこと
①縦向きに出力されるのデータの処理結果(deffの値)を、②別途作成しているデータフレームの背番号(no)に応じて、データフレームの新しい列に横向きに、for文で回しながら追加したい。という内容です。
色々試しましたが、自身の力が不足しており、どうしても解決できませんでした。
恐れ入りますが、初学者なこともあり、どのようなコードを、どこに入れればよいのか、ご教示いただきたくお願い申し上げる次第です。

前提

**#1.データ処理結果
データの処理結果は下表のように、縦向きに、出力されます。
データ処理のコードは下記のソースコード及び参考URLをご参照ください。
イメージ説明

ソースコード①

ソースコードは、https://zenn.dev/moripon/articles/ed5caa9c1d621e
(出所:pyparsingで競馬のコーナー通過順位をパースより引用)

import numpy as np
import pandas as pd
import pyparsing as pp

columns = ['diff', 'horse_no']

DIFF_GROUP = 0.3
DIFF_MIN = 1.5
DIFF_MID = 3.0
DIFF_MUCH = 6.0

class ParsePass():

def __init__(self): horse_no = pp.Word(pp.nums).setParseAction(self._horse_no_action) group = pp.Suppress(pp.Literal('(')) + \ pp.Optional(pp.delimitedList(pp.Word(pp.nums), delim=',')) + \ pp.Suppress(pp.Literal(')')) group.ignore('*') group.setParseAction(self._group_action) element = (group | horse_no) diff_min = pp.Suppress(pp.Optional(pp.Literal(','))).setParseAction(self._diff_min_action) + element diff_mid = pp.Suppress(pp.Literal('-')).setParseAction(self._diff_mid_action) + element diff_much = pp.Suppress(pp.Literal('=')).setParseAction(self._diff_much_action) + element self._passing_order = element + pp.ZeroOrMore( diff_mid | diff_much | diff_min ) def _horse_no_action(self, token): self._data = self._data.append({'diff':self._diff, 'horse_no':token[0]}, ignore_index=True) return def _group_action(self, token): for no in token: self._data = self._data.append({'diff':self._diff, 'horse_no':no}, ignore_index=True) self._diff += DIFF_GROUP self._diff -= DIFF_GROUP return def _diff_min_action(self, token): self._diff += DIFF_MIN return def _diff_mid_action(self, token): self._diff += DIFF_MID return def _diff_much_action(self, token): self._diff += DIFF_MUCH return def parse(self, pass_str): # 初期化 self._data = pd.DataFrame(columns=columns) self._diff = 0 # parse self._passing_order.parseString(pass_str) # index調整 self._data.index = np.arange(1, len(self._data)+1) self._data.index.name = 'rank' return self._data

test data

下は算出結果の出力例です。実際はfor文で回すため、該当のソースコード②を先に実行してから、pass_data =results[1]として出力しています。

if name == 'main':
pass_data = ["(*6,10)11(4,2,9)-(1,5)12,8,14(3,13,15)7-16",
"6(10,11)(4,2,9)(1,5)12(8,14)(3,13,15)7=16",
"12(7,14)8(6,11)9(3,5)(2,10)(1,4,13)",
"12(7,14)8(6,11)9(2,5)(3,1,10)(4,13)",
" (*10,14)-(8,4)-(12,11,9)5(2,1)7,6,13=3",
"(10,*14)-(8,4)-(11,1)2,9,5,6-(7,13)-12-3"]

pass_parsing = ParsePass()
pass_str in pass_data:
print(pass_parsing.parse(pass_str))

実現したいこと

現在、競技ID、最終順位、背番号、各通過地点のrankをpandasのデータフレーム(以下、現データフレーム)に格納しています。
実現したいことは、下表上段(黄色)の現データフレームの背番号(no)毎に、上述#1のデータ処理結果のnoに合致するdeffの数値(表の真中の列の数値)を抽出して、競技IDをKeyとしてfor文で回しながら、現データフレームの新しい列に横向きにdeffの数値を加えていきたいです(下図の緑色箇所)

イメージ説明

できたこと、できないこと
<できたこと>
競技IDをKeyとして、for文を回しながら、各地点の通過順位(rank)を取得すること、競技IDをKeyとして、for文を回しながら、#1の処理結果を出力することはできました。
<できないこと>
出力結果から①deffの数値が取り出せないこと、②現データフレームの競技ID、背番号(no)に応じて、deffの数値を現データフレームの新しい列に追加するためのfor文が書けませんでした。

なお、競技IDをKeyとしてfor文で回すために以下のコードを利用しています。
本ソースコードを先に実行してから、上述のソースコード①のtest dataにおいて、pass_data =results[1]として出力する。このコードの最後のresultsにあたります。
どうぞよろしくお願いいたします。

ソースコード②

import pandas as pd import time from tqdm import tqdm def scrape_race_results(race_id_list, pre_race_results={}): race_results = pre_race_results.copy() for race_id in tqdm(race_id_list): if race_id in race_results.keys(): continue try: url="https://db.netkeiba.com/race/" + race_id race_results[race_id] = pd.read_html(url)[4] time.sleep(1) except IndexError: continue except Exception as e: print(e) break except: break return race_results race_id_list=[] for place in range(1,11,1): for kai in range(1,6,1): for day in range(1,13,1): for r in range(1,13,1): race_id="2021"+str(place).zfill(2)+str(kai).zfill(2)+str(day).zfill(2)+str(r).zfill(2) race_id_list.append(race_id) test3 = scrape_race_results(race_id_list) for key in test3: test3[key].index = [key]*len(test3[key]) results = pd.concat([test3[key] for key in test3],sort=False)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

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