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

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

新規登録して質問してみよう
ただいま回答率
85.48%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

NumPy

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

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回答

4997閲覧

Python リストをデータフレームに変換したい

SuzuAya

総合スコア71

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

NumPy

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

Python 3.x

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

Python

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

pandas

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

0グッド

0クリップ

投稿2020/05/05 12:03

編集2020/05/06 05:56

前提・実現したいこと

以下の①~③を実現したいのですが、②、③が上手くいきません…。
自分で調べてもどうしてもわからなかったので、こちらに質問させて頂きました。
どなたかアドバイスを頂けますととても助かります。

①テストデータをfor文で少しずつずらしながら読み込み&テストを行い、それぞれの予測値を空リストに入れる
②リストをデータフレームに変換する
③データフレームの内容をcsvファイルに落とし込む

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

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-80-8f68d0ddf9c8> in <module>() ----> 1 pred_test_df = pd.DataFrame(y_pred) 2 print(pred_test_df) 2 frames /usr/local/lib/python3.6/dist-packages/pandas/core/internals/construction.py in prep_ndarray(values, copy) 293 values = values.reshape((values.shape[0], 1)) 294 elif values.ndim != 2: --> 295 raise ValueError("Must pass 2-d input") 296 297 return values ValueError: Must pass 2-d input

該当のソースコード

Python

1import pandas as pd 2import numpy as np 3# データの読み込み 4df = pd.read_csv("data.csv") 5print(df.head) 6#<bound method NDFrame.head of Day ... Province No.17 7#0 1 ... 0 8#1 2 ... 0 9 10#.. ... ... ... 11#99 100 ... 0 12#100 101 ... 0 13 14# データを特徴量と目的変数に分ける 15df_x = df.copy() 16df_y = df[['Province No.1','Province No.2','Province No.3','Province No.4','Province No.5','Province No.6','Province No.7','Province No.8','Province No.9','Province No.10','Province No.11','Province No.12','Province No.13','Province No.14','Province No.15','Province No.16','Province No.17']] 17print(df_x.head()) 18print(df_y.head()) 19# Day ... Province No.17 20#0 1 ... 0 21#1 2 ... 0 22#2 3 ... 0 23#3 4 ... 0 24#4 5 ... 0 25 26#[5 rows x 205 columns] 27# Province No.1 Province No.2 ... Province No.16 Province No.17 28#0 0 0 ... 0 0 29#1 0 0 ... 0 0 30#2 0 0 ... 0 0 31#3 0 0 ... 1 0 32#4 0 0 ... 0 0 33 34#[5 rows x 17 columns] 35 36import xgboost as xgb 37from sklearn.metrics import mean_squared_error 38from sklearn.externals import joblib 39from sklearn.multioutput import MultiOutputRegressor 40 41# xgboostモデルの作成 42reg = MultiOutputRegressor(xgb.XGBRegressor()) 43 44for n in range(5): 45 train_x = df_x[n:n+24] 46 train_y = df_y[n+24:n+48] 47 print('現在 train %1d の検証中です' %n) 48 49 reg = MultiOutputRegressor(xgb.XGBRegressor()) 50 reg.fit(train_x, train_y) 51 52# モデルを保存 53filename = 'model.sav' 54joblib.dump(reg, filename) 55 56# 学習モデルの評価 57train_x_pred = df_x[5:29]#Day6-29 58train_y_pred = df_y[29:53]#Day30-53 59pred_train = reg.predict(train_x_pred) 60 61print('RMSE for pred_train:', np.sqrt(mean_squared_error(train_y_pred, pred_train))) 62 63#テスト 64y_pred = [] 65y_true = [] 66 67for i in range(23): 68 test_x = df_x[i+29:i+53] 69 test_y = df_y[i+53:i+77] 70 print('現在 test %1d の検証中です' %i) 71 pred_test = reg.predict(test_x) 72 y_pred.append(pred_test) 73 y_true.append(test_y) 74 print('RMSE for pred_test:', np.sqrt(mean_squared_error(test_y, pred_test))) 75 76print(y_pred) 77#[array([[ 1.77417302e+00, 2.42700934e-01, 1.64597619e+00, 78 # 1.63864481e+00, 5.76995015e-01, 1.87968910e-02, 79 # -3.94308567e-03, 6.21627092e+00, 1.58334465e+01, 80 # 1.14232481e+00, 9.58841085e-01, 6.83230162e-03, 81 # 8.71272802e-01, -2.20537186e-04, 6.96563625e+00, 82 # 1.78707886e+01, -6.04650378e-02], 83 #[ 1.98073311e+01, -9.53328609e-03, 1.59746265e+00, 84 # ... 85 86#NumPy配列をDataFrameに変換 87pred_test_df = pd.DataFrame(y_pred) 88print(pred_test_df) 89

試したこと

pd.DataFrameで上手くいかなかったので、pd.Seriesで変換を試みたところエラーが発生しなかったのですが、変換したものをcsvファイルに落とし込んでみたところ、[[1.77417302e+00, 2.42700934e-01,...]]のままの形になっていました。

###補足情報
y_pred[0]を以下のようにデータフレームに変換できたらと思っていますが、可能でしょうか?

1 2 ... 16 17 0 0 0 ... 0 0 1 0 0 ... 0 0 2 0 0 ... 0 0 ... 22 0 0 ... 1 0 23 0 0 ... 0 0 #[24 rows x 17 columns]

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

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

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

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

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

meg_

2020/05/05 12:49

発生している問題・エラーメッセージにある「pred_test_df = pd.DataFrame(y_pred)」のコードが該当のソースコードにはありません。解決したい問題は何でしょうか?
SuzuAya

2020/05/05 12:56

>meg_様 失礼いたしました!! ソースコードの最後の部分を変更いたしました。 y_predをデータフレームに変換したい、というのがご相談事項です。
meg_

2020/05/05 13:08

y_predをどういうDataFrameにしたいのでしょうか? DataFrameの1列目にy_pred[0]、2列目にy_pred[1] ... ということですか? それともまた別の形式でしょうか?
SuzuAya

2020/05/05 13:59

y_predの各要素が24×17の行列になっています。これを、上から順にデータフレームに変換できたら、、と思っております。 つまり、データフレームの0〜23行目までは要素1、24〜47行目までは要素2、、という風にしたいです。 説明がうまくできておらず申し訳ありません。
meg_

2020/05/05 15:16

y_pred.shapeの結果を教えてください。
SuzuAya

2020/05/06 00:15

リストなのでShape表示ができませんでした。 y_predを表示させると以下のようになっております。 [array([[ 1.77417302e+00, 2.42700934e-01, 1.64597619e+00, # 1.63864481e+00, 5.76995015e-01, 1.87968910e-02, # -3.94308567e-03, 6.21627092e+00, 1.58334465e+01, # 1.14232481e+00, 9.58841085e-01, 6.83230162e-03, # 8.71272802e-01, -2.20537186e-04, 6.96563625e+00, # 1.78707886e+01, -6.04650378e-02], #[ 1.98073311e+01, -9.53328609e-03, 1.59746265e+00, # ...
meg_

2020/05/06 04:09

2次元arrayのリストなんですね。分かりました。 「データフレームの0〜23行目までは要素1、24〜47行目までは要素2、、」が分かりませんでした。 y_pred[0]を例に提示いただけませんか?※「要素」という言葉がデータフレームの行列にどう対応するのか?
SuzuAya

2020/05/06 04:22

申し訳ありません!私の説明が間違っておりました…。 正しくは、y_pred[0]をデータフレームの1行目、y_pred[1]をデータフレームの2行目…という風に変換させたいです。
meg_

2020/05/06 04:31

「y_predの各要素が24×17の行列」なので、データフレームの各行が「24×17」の列を持つということですか?
SuzuAya

2020/05/06 05:58

補足情報にイメージを追記させて頂きました。 もし、まだ情報が不足しておりましたら、これ以上お時間を奪ってしまうのは申し訳ないので、ご回答は不要です…(建前でなく)!! お手数をお掛けしてしまい申し訳ありません。いつも本当にありがとうございます。
guest

回答1

0

ベストアンサー

Python

1import numpy as np 2import pandas as pd 3 4y = np.array(range(24 * 17)) 5y = y.reshape(24, 17) 6y2 = np.array(range(24 * 17, 24 * 17 + 24 * 17)) 7y2 = y2.reshape(24, 17) 8 9y_list = [] 10y_list.append(y) 11y_list.append(y2) 12 13df_list = [] 14for i in y_list: 15 df = pd.DataFrame(i) 16 df_list.append(df) 17 18df = pd.concat(df_list) 19

下記部分をご自身のコードの変数に変えれば動作するかと思います。

df_list = [] for i in y_list: df = pd.DataFrame(i) df_list.append(df) df = pd.concat(df_list)

投稿2020/05/06 06:23

meg_

総合スコア10580

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

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

SuzuAya

2020/05/06 11:32

>meg_様 いつもありがとうございます。 大変助かりました。それとともに、貴重なお時間をたくさんいただき、申し訳ありません。 今後ともどうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問