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

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

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

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

pandas

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1731閲覧

Pandasを使って1列にまとめる方法

rogita

総合スコア19

Python 3.x

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

pandas

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/05/16 05:40

編集2019/05/16 07:00

前提・実現したいこと

イメージ説明
図のようなcsvをraceごとに一行にまとめたいです。
イメージ説明

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

ValueError Traceback (most recent call last) <ipython-input-155-4477f94c1bea> in <module> 35 Target_horse=pd.concat([Target_horse,Horse_Data],axis=0,sort=False) 36 print(str(count)+"回目") ---> 37 Enemy_horses=pd.concat([Enemy_horses,Pre_Enemy_horses]) 38 Pre_Enemy_horses=pd.DataFrame() 39 Enemy_horses=Enemy_horses.reset_index(drop=True)#ライバル馬の情報をまとめる

該当のソースコード

python

1import pandas as pd 2import numpy 3allData = pd.read_csv('ランダム.csv',engine='python') 4allData 5Y1 = allData['着順(y)']#正解となるデータを入れる 6X_sample = allData.drop(['着順(y)'], axis=1)#サンプルデータが入っている 7i=0#for文用 8k=0 9XPA=0#PA用のfor文変数 10count=0#何行目のデータなのか 11Horse_Data=pd.DataFrame() 12Target_horse=pd.DataFrame() 13Pre_Enemy_horses=pd.DataFrame() 14Enemy_horses=pd.DataFrame() 15Gate_1=0#1枠の馬がいる場所 16Now_race=1#現在のレース番号 17PA=4#現在のレース番号の終点 18XA=pd.DataFrame()#収納する場所 19for count in range(len(X_sample)): 20 if allData.at[count,'race']!=Now_race: 21 Now_race+=1#調べるレースの対象を変更する 22 Gate_1=count#1枠の馬がいる場所を変える 23 print(Gate_1) 24 for XPA in range(Gate_1,20): 25 if allData.at[XPA,'race']==Now_race+1: 26 PA=XPA 27 break 28 for i in range(Gate_1,PA+1): 29 if allData.at[count,'race']!=Now_race: 30 print("x"+str(Gate_1)) 31 break 32 Horse_Data=X_sample.loc[[i]] 33 Horse_Data=Horse_Data.drop(['race'],axis=1) 34 Horse_Data=Horse_Data.reset_index(drop=True) 35 if i!=count: 36 Pre_Enemy_horses=pd.concat([Pre_Enemy_horses,Horse_Data],axis=1,sort=False) 37 Pre_Enemy_horses=Pre_Enemy_horses.reset_index(drop=True) 38 else : 39 Target_horse=pd.concat([Target_horse,Horse_Data],axis=0,sort=False) 40 print(str(count)+"回目") 41 Enemy_horses=pd.concat([Enemy_horses,Pre_Enemy_horses]) 42 Pre_Enemy_horses=pd.DataFrame() 43Enemy_horses=Enemy_horses.reset_index(drop=True)#ライバル馬の情報をまとめる 44Target_horse=Target_horse.reset_index(drop=True)#予想対象の馬の情報をまとめる 45XA=pd.concat([Target_horse,Enemy_horses],axis=1)#合体させる

CSV

race,馬番,能力1,能力2,着順(y)
1,1,0.112115797,0.980271793,0.5
1,2,0.10156389,0.15123039,0.25
1,3,0.141461107,0.889222429,0.75
1,4,0.364152658,0.504141353,1
2,1,0.232178085,0.811654683,0.25
2,2,0.490554328,0.271948642,0.75
2,3,0.912273302,0.545971675,1
2,4,0.306427195,0.219543843,0.5
3,1,0.84874005,0.225376628,0.75
3,2,0.980524014,0.518634533,1
3,3,0.793379468,0.707376409,0.5
3,4,0.337912623,0.340699924,0.25
4,1,0.865030143,0.54997774,1
4,2,0.743468075,0.717770634,0.75
4,3,0.175989149,0.219996247,0.5
4,4,0.032296776,0.140063011,0.25
5,1,0.108151134,0.01417521,0.25
5,2,0.812937171,0.969057406,0.75
5,3,0.869512736,0.196469624,1
5,4,0.380255494,0.544955296,0.5
6,1,0.265640962,0.367447423,0.25
6,2,0.606604272,0.149497873,0.5
6,3,0.748067103,0.704372874,0.75
6,4,0.896956794,0.22287917,1

追記

len(X_sample)の所が17以下だとエラーは起きませんが、18以上だとエラーが起きます。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

tiitoi

2019/05/16 05:46

画像だとコピペできないので、データはソースコード同様、テキスト形式で質問欄に貼り付けてください。
rogita

2019/05/16 07:09

分かりました。
guest

回答1

0

ベストアンサー

df.groupby('race').apply(lambda d: d[['馬番','能力1','能力2','着順(y)']].stack().reset_index(level=0, drop=True))
でどうでしょうか。

Python

1import pandas as pd 2import io 3 4data = """ 5race,馬番,能力1,能力2,着順(y) 61,1,0.112115797,0.980271793,0.5 71,2,0.10156389,0.15123039,0.25 81,3,0.141461107,0.889222429,0.75 91,4,0.364152658,0.504141353,1 102,1,0.232178085,0.811654683,0.25 112,2,0.490554328,0.271948642,0.75 122,3,0.912273302,0.545971675,1 132,4,0.306427195,0.219543843,0.5 143,1,0.84874005,0.225376628,0.75 153,2,0.980524014,0.518634533,1 163,3,0.793379468,0.707376409,0.5 173,4,0.337912623,0.340699924,0.25 184,1,0.865030143,0.54997774,1 194,2,0.743468075,0.717770634,0.75 204,3,0.175989149,0.219996247,0.5 214,4,0.032296776,0.140063011,0.25 225,1,0.108151134,0.01417521,0.25 235,2,0.812937171,0.969057406,0.75 245,3,0.869512736,0.196469624,1 255,4,0.380255494,0.544955296,0.5 266,1,0.265640962,0.367447423,0.25 276,2,0.606604272,0.149497873,0.5 286,3,0.748067103,0.704372874,0.75 296,4,0.896956794,0.22287917,1 30""" 31 32df = pd.read_csv(io.StringIO(data)) 33ret = df.groupby('race').apply(lambda d: d[['馬番','能力1','能力2','着順(y)']].stack().reset_index(level=0, drop=True)) 34# 馬番 能力1 能力2 着順(y) 馬番 ... 着順(y) 馬番 能力1 能力2 着順(y) 35#race ... 36#1 1.0 0.112116 0.980272 0.50 2.0 ... 0.75 4.0 0.364153 0.504141 1.00 37#2 1.0 0.232178 0.811655 0.25 2.0 ... 1.00 4.0 0.306427 0.219544 0.50 38#3 1.0 0.848740 0.225377 0.75 2.0 ... 0.50 4.0 0.337913 0.340700 0.25 39#4 1.0 0.865030 0.549978 1.00 2.0 ... 0.50 4.0 0.032297 0.140063 0.25 40#5 1.0 0.108151 0.014175 0.25 2.0 ... 1.00 4.0 0.380255 0.544955 0.50 41#6 1.0 0.265641 0.367447 0.25 2.0 ... 0.75 4.0 0.896957 0.222879 1.00

投稿2019/05/16 07:10

編集2019/05/16 07:17
magichan

総合スコア15898

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

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

magichan

2019/05/16 07:17

データが追加されたようですので、サンプルを追加しました
rogita

2019/05/16 07:41 編集

ありがとうございます。 所でこれでできた配列はいったいどのような型になっているのでしょうか。 取り出す際はいったいどうすればよろしいのでしょうか。
rogita

2019/05/16 07:54

raceを行数にして、その他を列名にするにはどうすればよろしいのでしょうか。
magichan

2019/05/16 08:01

> いったいどのような型 raceがindex に設定された DataFrame型です。
magichan

2019/05/16 08:02

> raceを行数にして、その他を列名にするには スミマセン。意味が汲み取れません。もう少し具体的に(こんな形式でデータを得たいなど)を記述していただけますでしょうか
rogita

2019/05/16 08:02

分かりました。
rogita

2019/05/16 08:03

答えていただきありがとうございました。
rogita

2019/05/16 11:27

馬番,能力1,能力2,馬番,能力1,能力2 1,30,40,2,44,33 1,50,40,2,34,23 こんな形です。
magichan

2019/05/16 12:42

直接 行と列の番号をilocで指定して取得するのはダメですか? 例えば、0,1行目(1レース2レース)の 0,1,2,4,5,6 列目を指定して ret.iloc[[0,1], [0,1,2,4,5,6]] みたいに。
rogita

2019/05/17 06:28

分かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問