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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

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

pandas

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

Q&A

2回答

3212閲覧

PandasのNaNの正体

yamato_user

総合スコア2321

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

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

pandas

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

1グッド

0クリップ

投稿2019/05/10 02:20

PandasのNaNの正体を教えてください。まずは下記をご覧ください。

Python

1>>> x1=pd.DataFrame({ 2 "id":[1,2,3,4,5,6,7,8,9,10], 3 "name":["1_name","2_name","3_name","4_name","5_name","6_name","7_name","8_name","9_name","10_name"] 4}) 5 6>>> x2=pd.DataFrame({ 7 "id":[1,2,3,4,5,6,7], 8 "department":["1_department","2_department","3_department","4_department","5_department","6_department","7_department"] 9}) 10 11>>> x = pd.merge(x1, x2, how="left" ,left_on=["id"],right_on=["id"])

で、データフレームxを作成します。

Python

1>>> x
idnamedepartment
11_name1_department
22_name2_department
33_name3_department
44_name4_department
55_name5_department
66_name6_department
77_name7_department
88_nameNaN
99_nameNaN
1010_nameNaN

このデータフレームのNaNの箇所について下記の様になります

Python

1# PythonのNone 2>>> x["department"][8]==None#False 3 4# mathのnan 5>>> math.isnan(x["department"][8])# True 6>>> x["department"][8]==math.nan# False 7 8# Numpyのnan 9>>> x["department"][8]==np.nan# False 10>>> np.isnan(x["department"][8])# True

math.isnan()とmath.nanの時で真偽が異なるのも意味不明です。PandasのNaNはいったい何を表すのでしょうか?

具体的に困っている点
データフレームの特定の箇所を欠損させる処理を行った後、任意の条件に従ってデータを取捨選択してきますが、NoneとPandasのNaNは異なる値と判定されるので困っています。

nouken👍を押しています

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

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

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

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

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

guest

回答2

0

型を見ればわかりますが、pandasのnan(を取り出した段階のもの)にしろ、math.nanにしろ、floatのnanです。

python

1>>> type(x["department"][8]) 2<class 'float'> 3>>> type(math.nan) 4<class 'float'>

ただし、そもそもnanは自分自身との比較でFalseを返します。

python

1>>> math.nan == math.nan 2False

必ずisnan系の関数かメソッドで比較するようにすればいいでしょう。

投稿2019/05/10 02:26

hayataka2049

総合スコア30933

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

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

yamato_user

2019/05/10 02:27

データフレームの特定の箇所にNaNを代入したいのですが、どうすればいいですか? > x["department"][7]=None だとNoneが入りますよね?Noneでなく、NaNを代入したいです。
hayataka2049

2019/05/10 02:29 編集

math.nanかnp.nanを代入すればいいのでは。それかfloat("nan")でもいけます(NaNは IEEE 754 浮動小数点規格で表されていますので、準拠あるいは影響を受けた浮動小数点型であれば表現できます)
yamato_user

2019/05/10 02:31

出来ました(*^▽^*) ありがとうございます(´;ω;`)
guest

0

NaN(=numpy.nan=math.nan)非数を表しNoneとは異なります。
また、NaNの重要な性質としてNaNのお話に記載のあるとおり

  • NaNとの四則演算は常にNaN
  • NaNとの!=以外の比較演算は常にfalse、!=は常にtrue

となります。したがって提示の比較演算はFalseとなります。
これではある値がNaNか判定できないので、それ専用の関数numpy.isnan()が存在します。

他、参考:python】0,None,numpy.nanの比較

投稿2019/05/10 02:41

can110

総合スコア38262

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問