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

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

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

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

Q&A

1回答

1299閲覧

object? float?

Pablito

総合スコア71

Python

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

0グッド

0クリップ

投稿2019/08/27 01:21

編集2019/08/27 02:10

前提・実現したいこと

以前こちらでも質問させて頂いたコードで、
object型のa4という、0~14までの要素があるカラムで
12を1, 2, 12ではなく、12だけでフラグ立てをするために、
.split(',')で区切って、
その後、int型に変換する操作をしたいのですが、
以下のエラーが起きてしまいます。

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

--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-31-4a6116436e5e> in <module> 7 return 0 8 ----> 9 data['その他市販'] = data['a4'].apply(shampoo13) 10 11 #row→row.split(';') c:\users\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds) 4036 else: 4037 values = self.astype(object).values -> 4038 mapped = lib.map_infer(values, f, convert=convert_dtype) 4039 4040 if len(mapped) and isinstance(mapped[0], Series): pandas\_libs\lib.pyx in pandas._libs.lib.map_infer() <ipython-input-31-4a6116436e5e> in shampoo13(row) 1 def shampoo13 (row): ----> 2 data = row.split(';') 3 list_ = list(map(int, data)) 4 if 12 in list_: 5 return 1 AttributeError: 'float' object has no attribute 'split'

該当のソースコード

def shampoo13 (row): data = row.split(';') list_ = list(map(int, data)) if 12 in list_: return 1 else: return 0 data['その他市販'] = data['a4'].apply(shampoo13) #row→row.split(';')

*dataは元のデータです。

ちなみにdata['a4']は

Python

1print(data['a4'])
0 12 1 12 2 12 3 12 4 12 ... 2578478 NaN 2578479 NaN 2578480 NaN 2578481 NaN 2578482 NaN Name: a4, Length: 2578483, dtype: object

data['a4']だけ抜いたデータを作ったときは
動いていました。

何卒宜しくお願い致します。

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

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

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

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

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

can110

2019/08/27 02:07

data['a4']列の型と値を明確に確認できるよう 「data['その他市販'] = data['a4'].apply(shampoo13)」の手前に「print(data['a4'])」を追加して実行し そのprint結果をそのまま提示ください。
Pablito

2019/08/27 02:10

can110さん ありがとうございます。 質問を修正したので、 ご確認よろしくお願いいたします。
can110

2019/08/27 03:42

入力データに決まりがない場合、いろいろなデータを想定しないといけないのですが、たとえば data = pd.DataFrame({'a4':['1;2','12', '', 'a;12', '12;a', pd.np.nan, None]}) の場合、data['その他市販'] = data['a4'].apply(shampoo13) はどのような結果になるべきでしょうか?
guest

回答1

0

'a4' カラムが 'float型'になっているようです。

print(data.dtypes) にて型を確認してみてください。

上記のコードをそのまま使いたいのであれば

Python

1data['その他市販'] = data['a4'].astype('str').apply(shampoo13)

とでもして、'a4' カラムを 'str型'(object型)に変換するとよいのではないでしょうか

投稿2019/08/27 01:40

編集2019/08/27 01:40
magichan

総合スコア15898

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

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

Pablito

2019/08/27 01:50

ご回答ありがとうございます。 確認しましたが、 a4 object a5 object とでました。
Pablito

2019/08/27 02:05 編集

因みに以下のコードで実行しましたが、 エラーが起きてしまいました。 すいません。。。 def shampoo13 (row): data = row.split(';') list_ = list(map(int, data)) if 12 in list_: return 1 else: return 0 data['その他市販'] = data['a4'].astype('str').apply(shampoo13) #row→row.split(';') --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-32-56300d484ca9> in <module> ----> 1 data['その他市販'] = data['a4'].astype('str').apply(shampoo13) 2 def shampoo13 (row): 3 data = row.split(';') 4 list_ = list(map(int, data)) 5 if 12 in list_: c:\users\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds) 4036 else: 4037 values = self.astype(object).values -> 4038 mapped = lib.map_infer(values, f, convert=convert_dtype) 4039 4040 if len(mapped) and isinstance(mapped[0], Series): pandas\_libs\lib.pyx in pandas._libs.lib.map_infer() <ipython-input-31-4a6116436e5e> in shampoo13(row) 1 def shampoo13 (row): 2 data = row.split(';') ----> 3 list_ = list(map(int, data)) 4 if 12 in list_: 5 return 1 ValueError: invalid literal for int() with base 10: 'nan'
Pablito

2019/08/27 02:07

因みにですが、 'a4'はobject型でなはく、 int型にしたいのですが、 そうすると data['その他市販'] = data['a4'].astype('int').apply(shampoo13) になったりしますか???
magichan

2019/08/27 02:08

ん。であれば、データに欠損値が含まれてるような気がします。 print(data[data['a4'].isna()]) で欠損値を表示してみてください
magichan

2019/08/27 02:11

元のデータが "1;2" に';' が含まれてるのではなかったですか? であれば、そのまま astype('int') は出来ないですよね。
Pablito

2019/08/27 02:18

欠損値あるようです。 また、int型の話その通りです。 ありがとうございます。
magichan

2019/08/27 02:31

やはりそうですか。 であれば、とりあえずはshampoo13 関数の最初に if row is np.nan: __return np.nan などとして、欠損値の場合の処理(splitを実行しないようにする処理)を追加すると良いかと思います。
Pablito

2019/08/27 02:37

( ,,`・ω・´)ンンン? すいません。 ValueError: invalid literal for int() with base 10: 'nan' それでもこういったエラーが起きてしまいます。。。 労力をとらせてしまい申し訳ありません。。。
magichan

2019/08/27 02:51

まだ何かしらの不正データがあるのかもしれませんね・・。 とりあえず、エラーが発生した行を try: except で囲んでどのようなデータのときに例外が発生したかを表示してみるのが早いかと思います。 たとえば、例外が list_ = list(map(int, data)) の行で発生していたら try: __list_ = list(map(int, data)) except ValueError: __print("VALUE ERROR: ", row) (行頭の '_' はインデントです) のように記述することで どのような row が来たときに ValueErrorが発生したかを表示できます。
Pablito

2019/08/27 02:57

以下のエラーが起きてしまいます。 これはシンプルに書き方が違うということですかね? File "<ipython-input-26-c46544ab9d92>", line 12 except ValueError: ^ SyntaxError: invalid syntax <code> def shampoo13 (row): data = row.split(';') list_ = list(map(int, data)) if row is np.nan: return np.nan if 12 in list_: return 1 else: return 0 try: list_ = list(map(int, data)) except ValueError: print("VALUE ERROR: ", row) data['その他市販'] = data['a4'].astype('str').apply(shampoo13)
magichan

2019/08/27 03:05

関数の行末に追記するのではなく、エラーが起きている行を try と except で囲うという意味です。
Pablito

2019/08/28 07:44

すいません。。。 ValueError Traceback (most recent call last) <ipython-input-28-8afa61a08991> in <module> 8 else: 9 return 0 ---> 10 data['その他市販'] = data['a4'].astype('str').apply(shampoo13) 11 12 #row→row.split(';') この通りdata['その他市販'] = data['a4'].astype('str').apply(shampoo13) の コードでエラーが起きているようなのですが、 これでもtryとexceptでできますか?
magichan

2019/08/28 10:12

その部分で例外が発生しているのでしたら、shampoo13 関数の戻り値に不正な値がある可能性がありますね。 とりあえず、shampoo13 関数に print文を仕込んで例外が発生する直前に、shampoo13関数にどのようなデータが渡って、戻り値は何かを見てみるとよいのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問