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

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

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

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

Q&A

解決済

2回答

295閲覧

pythonのmap関数で繰り返し番号を取得する

stair_rod

総合スコア9

Python 3.x

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

0グッド

1クリップ

投稿2019/09/08 06:34

編集2019/09/08 06:50

前提・実現したいこと

python,pandasのdataframeに対して、map関数を適用させているのですが、
エラーが発生してしまうので、そのエラーが起こっている繰り返し番号を取得したいです。

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

2018-10-07 18:00:00
2018-10-08 08:30:00
2018-10-08 10:00:00
2018-10-08 18:00:00
2018-10-09 08:30:00
2018-10-09 17:00:00
2018-10-10 11:00:00
Miss
Miss
Miss
nan

---> 28 mlist = list(datetimebef)
29 month = mlist[5:7]
30 month2 = ''.join(month)

TypeError: 'float' object is not iterable

該当のソースコード

def mapping(datetimebef):  if datetimebef is np.nan or datetimebef == 'nan':  print('Miss')  return np.nan else: print(datetimebef) mlist = list(datetimebef) month = mlist[5:7] month2 = ''.join(month) month2 = int(month2) return month2 A= df['datetime'].map(mapping)

試したこと

floatはiterableじゃないと言われているので、エラーが起こっているデータを見たところ、datetimebefはnanと出力されていました。そこで、mapping内でdatetimebef == 'nan'としてみましたが、elseの方で処理されてしまっています。df['datetime']はpandasでcsvファイルを読み込んでいるので、ここに入ってあるデータを確認したいのですが10万行近くあるので目視では困難です。どうぞお願いいたします。

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

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

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

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

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

meg_

2019/09/08 06:43 編集

コードはインデントが判るようにしてください。 「コードの挿入」で入力してください。
can110

2019/09/08 06:43

print( df['datetime'][0:5])なりの実行結果(どんなデータであるか)を提示ください。
meg_

2019/09/08 06:45

map関数で何を適用したいのか説明お願いします。 ※自作関数の簡単な説明
stair_rod

2019/09/08 06:55

>>can110様 基本的に2018-10-09 17:00:00のようなdatetime型変数が入っています >> meg_様 コードで挿入しました。ありがとうございます。 df['datetime']の中に2020-00-00 18:00:00のような異常値(月が1~12の範囲外)にあるデータが存在しますので、これをNanに変更するために、NaN以外のデータから月の部分を抽出しようとしています。
can110

2019/09/08 07:07

datetime型であれば「2020-00-00 18:00:00」という異常値はそもそも含まれ得ないはずです。 dfの中身がよく分からないので、df生成部分のコードと、もしread_csvなりでファイルから読み込んているのであれば、現象が再現する最小限のファイル内容も提示ください。
stair_rod

2019/09/08 07:19

すみません、type(df['datetime'])で確認したところ、 <class 'pandas.core.series.Series'>でした。 df = pd.read_csv('./test.csv') で読み込んでおり、df['datetime']の中身は 2018-10-01 16:00:00 2018-10-01 18:00:00 2018-10-02 17:00:00 ... NaN NaN のような感じです。また、読み込んだままだと2050年とかのデータがあるので、これをNaNにするために、 df.loc[df['datetime'] > f'{pd.Timestamp.max:%Y%M%d}', 'datetime'] = pd.np.nan という処理を行っています。
guest

回答2

0

ベストアンサー

dfの内容がいまひとつ把握できていませんが、以下にてNaN以外の月部分を抽出できるかと思います。
NaNかの判定はpandas.isnullを使います。

Python

1import pandas as pd 2 3df = pd.DataFrame({'datetime':['2018-10-01 16:00:00', pd.np.nan]}) 4 5def mapping(v): 6 if not pd.isnull(v): 7 return int(v[5:7]) 8 9A = df['datetime'].map(mapping) 10print(A) 11#0 10.0 12#1 NaN 13#Name: datetime, dtype: float64

投稿2019/09/08 07:45

can110

総合スコア38256

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

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

stair_rod

2019/09/08 07:51

解決しました。ありがとうございます。 今までpandasを使ったことがなかったもので、isnanが適用できず色々困惑していました。 お二方とも誠にありがとうございました。
guest

0

df['datetime']のデータ全て「2020-00-00 18:00:00」の形式の文字列の場合
※NGデータをnp.nanする

Python

1def mapping(datetimebef): 2 if datetimebef is np.nan or datetimebef == 'nan': 3 print('Miss') 4 return np.nan 5 else: 6 print(datetimebef) 7 month = int(datetimebef.split('-')[1]) 8 if month < 0 or month > 12: 9 return np.nan 10 else: 11 return datetimebef 12

投稿2019/09/08 07:22

meg_

総合スコア10579

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

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

stair_rod

2019/09/08 07:37

'float' object has no attribute 'split' と出てしまいます。おそらく、文字列の分割ではなく、 文字列として関数内に入ってしまうため、NaNのif分岐が適切に判定されていないのが原因だと思います。 https://echomist.com/pd-na-nan/ を参考に少し自分で考えてみます。申し訳ありません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問