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

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

ただいまの
回答率

88.61%

Pandas(Python): データを呼び出すと, Nanになる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,403

B-Hirosuke

score 19

 Pandasでデータを呼び出すとNanになる

現在,CSVファイルをpandasで操作する練習をしています.  
データフレームを作るまでは,なんとかできました.
しかし,データフレームから値を取り出そうとすると,値がNanになってしまいます.  
なぜ,このようなことが起こるのかをご教授いただけないでしょうか.

 ソースコード

"""ファイル名: main.py"""

# CSVデータの読み込み
df = pd.read_csv("<CSVファイル>", header=0)
# データが何個あるかを調べる
Num_of_Data = len(df)
# データを呼び出す
for idx in range(Num_of_Data):
    data = df.ix[idx]
    d = data[["d"]].values
    print(d)

 CSVファイルの一部

d,p,d2,d1,ac,d3,a3,a1,a1a3,r
20,4,18,16,0.25,15.5,189,201,1.07,0.25
20,2,19,18,0.25,17.5,241,254,1.06,0.25
22,8,18,14,0.5,13,133,154,1.16,0.5
22,5,19.5,17,0.25,16.5,214,227,1.06,0.25
22,3,20.5,19,0.25,18.5,269,284,1.05,0.25
24,8,20,16,0.5,15,177,201,1.14,0.5
24,5,21.5,19,0.25,18.5,269,284,1.05,0.25
24,3,22.5,21,0.25,20.5,330,346,1.05,0.25
...

 ソースコードを実行した場合

$ python main.py
[nan]
[nan]
[nan]
[nan]
[nan]
[nan]
[nan]
[nan]
...

 試したこと

 変数dataを表示する

# CSVデータの読み込み
df = pd.read_csv("<CSVファイル>", header=0)
# データが何個あるかを調べる
Num_of_Data = len(df)
# データを呼び出す
for idx in range(Num_of_Data):
    data = df.ix[idx]
    print(data)

とすると

$ python main.py
d       20.00
p         4.00
d2       18.00
d1       16.00
ac        0.25
d3       15.50
a3      189.00
a1      201.00
a1a3      1.07
r         0.25
Name: 0, dtype: float64
d       20.00
p         2.00
d2       19.00
d1       18.00
ac        0.25
d3       17.50
a3      241.00
a1      254.00
a1a3      1.06
r         0.25
Name: 1, dtype: float64
d       22.00
p         8.00
d2       18.00
d1       14.00
ac        0.50
d3       13.00
a3      133.00
a1      154.00
a1a3      1.16
r         0.50
Name: 2, dtype: float64
d       22.00
p         5.00
d2       19.50
d1       17.00
ac        0.25
d3       16.50
a3      214.00
a1      227.00
a1a3      1.06
r         0.25
Name: 3, dtype: float64
d       22.00
p         3.00
d2       20.50
d1       19.00
ac        0.25
d3       18.50
a3      269.00
a1      284.00
a1a3      1.05
r         0.25
Name: 4, dtype: float64
d       24.00
p         8.00
d2       20.00
d1       16.00
ac        0.50
d3       15.00
a3      177.00
a1      201.00
a1a3      1.14
r         0.50
Name: 5, dtype: float64
d       24.00
p         5.00
d2       21.50
d1       19.00
ac        0.25
d3       18.50
a3      269.00
a1      284.00
a1a3      1.05
r         0.25
Name: 6, dtype: float64
d       24.00
p         3.00
d2       22.50
d1       21.00
ac        0.25
d3       20.50
a3      330.00
a1      346.00
a1a3      1.05
r         0.25
Name: 7, dtype: float64
...

というように,"d"に値が入っています.

 "d"以外のデータを呼び出す

"""ファイル名: main.py"""

# CSVデータの読み込み
df = pd.read_csv("<CSVファイル>", header=0)
# データが何個あるかを調べる
Num_of_Data = len(df)
# データを呼び出す
for idx in range(Num_of_Data):
    data = df.ix[idx]
    a3 = data[["a3"]].values
    print(a3)

とすると

$ python main.py
[189.]
[241.]
[133.]
[214.]
[269.]
[177.]
[269.]
[330.]
[227.]
[330.]
[398.]
...


のように,値を呼び出すことができます.

 追記

"""ファイル名: main.py"""

# CSVデータの読み込み
df = pd.read_csv("<CSVファイル>", header=0)
print(df.head())
print(df.info())


とすると

   d  p    d2  d1    ac    d3   a3   a1  a1a3     r
0  20  4  18.0  16  0.25  15.5  189  201  1.07  0.25
1  20  2  19.0  18  0.25  17.5  241  254  1.06  0.25
2  22  8  18.0  14  0.50  13.0  133  154  1.16  0.50
3  22  5  19.5  17  0.25  16.5  214  227  1.06  0.25
4  22  3  20.5  19  0.25  18.5  269  284  1.05  0.25
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 161 entries, 0 to 160
Data columns (total 10 columns):
d      161 non-null int64
p       161 non-null int64
d2      161 non-null float64
d1      161 non-null int64
ac      161 non-null float64
d3      161 non-null float64
a3      161 non-null int64
a1      161 non-null int64
a1a3    161 non-null float64
r       161 non-null float64
dtypes: float64(5), int64(5)
memory usage: 12.7 KB
None


でした.

 最後に

現在,pandasの使い方を勉強してますが,わからないことが多いです.  
良い本やサイトがあれば,教えていただけないでしょうか.  
また,teratailでの質問の仕方に「もう少しこういう風にしたら良いよ」というのがありましたら,ご教授いただけると幸いです.

よろしくお願いします.
長文失礼しました.

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2018/12/02 12:43

    Nanになる現象が再現できません。CSV読込後に「print(df.head())」と「print(df.info())」した結果を追記ください。

    キャンセル

  • B-Hirosuke

    2018/12/02 17:06

    追加しました.よろしくお願いします.

    キャンセル

  • can110

    2018/12/02 17:29

    追記ありがとうございます。データには問題ないようですね。ひとつ可能性あるので回答に書きます。

    キャンセル

回答 2

check解決した方法

+1

 解決方法

can110様
色々とご教授いただきまして,ありがとうございます.  
can110様の環境では,Nanが表示されなかったということを聞き,私の環境を調べました.

そして,pandasのバージョンをアップデートすることで問題を解決できました.

私は,pandas=0.18.1を使用しており,pandas=0.23.4にアップデートしました.

ありがとうございました.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

コード、CSVファイルには問題ないと思います。提示されたCSVファイルで動作確認したところ正常に'd'列の値が表示されました。

ひとつの可能性として、CSVファイルの末尾あたり、以下のように値のない行が存在していないでしょうか?
それでprintで目視確認したときに[nan]が表示されている可能性あります。

d,p,d2,d1,ac,d3,a3,a1,a1a3,r
20,4,18,16,0.25,15.5,189,201,1.07,0.25
,,,,,,,,,
,,,,,,,,,
20,2,19,18,0.25,17.5,241,254,1.06,0.25
22,8,18,14,0.5,13,133,154,1.16,0.5


以下のようなコードで欠損値(nan)が含まれている行がないか分かりますので確認してみてください。

"""ファイル名: main.py"""

import pandas as pd

# CSVデータの読み込み
df = pd.read_csv("inp.csv", header=0)

# 欠損値(nan)が含まれる行を除いた行数と比較
row1 = len(df)
row2 = len(df.dropna())
print(row1,row2) # 5 3

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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