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

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

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

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

pandas

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

Q&A

解決済

2回答

9050閲覧

pandasデータフレームを1行だけ取り出したい

miraMirar

総合スコア10

Python 3.x

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

pandas

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

0グッド

0クリップ

投稿2020/04/17 01:37

編集2020/04/17 01:39

前提・実現したいこと

pythonで機械学習の勉強をしています。プログラミングは初心者で、独学です。
one leave out法を試すため、読み込んだ学習用データセット9件のcsvを学習用8個とテスト用1個に分けたいです。
(本当はもっとスマートな方法があるのだと思いますが、今回はここでつまずいたのでここについて質問させてください。)

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

8個の学習用データで学習させ、1個のテスト用データで予測させようとしたところ、以下のエラーが出ました。

Expected 2D array, got 1D array instead:

array=[88 0. 35 0.3 ].

Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

該当のソースコード

python3

1Xtrain = train0.iloc[:,0:4] 2Ytrain = train0.iloc[:,4] 3Xtest = test0.iloc[0:4] 4で、1行だけのデータフレームにしたつもりだったのですが 5print(Xtest)で見ると 6 7 8Columns1 88 9 10Columns2 0.00 11 12Columns3 35 13 14Columns4 0.30 15 16Name: 0, dtype: float64 17 18と、表の形ではなくなっていました。 19 20### 試したこと 21 22エラーメッセージにreshapeしろと書いてあったので 23Xtest.reshape(1, -1)としてみると、 24AttributeError: 'DataFrame' object has no attribute 'reshape' 25とエラーが出ました。 26 27Xtestと列名からデータフレームを作ろうと考え、 28 29Xtest = pd.DataFrame(Xtest, columns=Xtrain.columns) 30 31Xtest.head() 32としてみると、なぜかXtestの数値がなく列名だけの表が表示されました。 33 34データフレームの扱い方があまりわかっていません。 35すみませんがよろしくお願いします。 36 37### 補足情報(FW/ツールのバージョンなど) 38jupyter notebook

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず基本的な知識として、 pandas には主に 2次元のテーブルデータを扱う DataFrame と呼ばれるものと、1次元データを扱う Series とよばれるものがあります。(他にもあるけど今回は省略)

で、今回「表の形ではなくなった」と言っている Xtestですが

```Python`
Columns1 88
Columns2 0.00
Columns3 35
Columns4 0.30
Name: 0, dtype: float64

と表示されているので、Series型のデータになっているということになります。 pandas では一般的に DataFrameから、特定の列を1列だけ(または特定の行を1行だけ)抜き出したデータは、1次元のSeriesデータとして扱われるのです。 で、次に `iloc[]` の用法ですが、スライスを使って ```Python df.iloc[0:4, :] # 0~3行のデータを抜き出す df.iloc[:, 0:4] # 0~3列のデータを抜き出す

のように複数行(列)を抜き出した場合の結果は2次元データとなりますので、出力をDataFrameで得ることができるのですが、

Python

1df.iloc[4, :] # 4行のデータを抜き出す 2df.iloc[:, 4] # 4列のデータを抜き出す

のように1列(行)を抜き出した場合の結果は1次元データとなりますので、出力はSeriesで得ることになります。

ちなみに df.iloc[4, 4] のようにセルを直接指定した場合は、セルの値がそのまま出力されます。

で、ここでやっと質問への回答ですが、今回のように 1列(行)を抜き出した際の結果を SeriesではなくDataFrameで得たいのであれば、列(行)番号をリスト形式で与えて

Python

1df.iloc[[4], :] # 4行のデータをDataFrameのまま抜き出す 2df.iloc[:, [4]] # 4列のデータをDataFrameのまま抜き出す

とすると良いかと思います。

投稿2020/04/17 02:55

magichan

総合スコア15898

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

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

miraMirar

2020/04/17 05:10

できました! そして何が起こっていたのかよくわかりました。 質問に抜けていたのですが、記載したコードの前に train0 = df.iloc[1:,] test0 = df.iloc[0,] と書いていて、seriesになったのはここで起こったことでした。 テストデータはyがいらないので、 Xtest = df.iloc[[0],0:4] とすると1回でいけました。 ありがとうございました!
guest

0

具体的なデータ内容や,処理がわからないので的外れな回答になっているかもしれませんが以下はどうでしょうか?

python

1# Xtest = test0.iloc[0:4] の箇所を次のように変更 2Xtest = test0.iloc[04].values.reshape(1,-1) #ndarrayとして抜き出してreshape 3 4# Xtestをデータフレームにしたいなら以下の処理を上記のコードの次に追加 5Xtest = pd.DataFrame(Xtest, columns=Xtrain.columns)

投稿2020/04/17 02:01

編集2020/04/17 02:03
DataAnalOjisan

総合スコア49

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

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

miraMirar

2020/04/17 05:00

できました! DataFrameからndarrayとして抜き出せるんですね。 reshapeの使い方も知らなかったので勉強になりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問