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

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

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

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

Q&A

解決済

2回答

1757閲覧

pandasを使ったデータ前処理における特徴量抽出時のError

kyouyaP

総合スコア3

Python

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

0グッド

0クリップ

投稿2019/08/09 14:31

前提・実現したいこと

機械学習のための特徴量エンジニアリングの演習をjupyter notebookで演習していたら演習本にある特徴量エンジニアリングのコードがうまく行きませんでした。

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

--------------------------------------------------------------------------- --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-33-cbf28bafe369> in <module> 12 # YelpのビジネスデータからcategoriesがNightlife(ナイトライフ@<fn>{nightlife})またはRestaurants(レストラン)のデータを取り出し 13 filter_func = lambda x: len(set(x) & set(['Nightlife', 'Restaurants'])) > 0 ---> 14 twobiz = biz_df[biz_df['categories'].apply(filter_func)] 15 16 # 取り出した2つのカテゴリのYelpのビジネスデータとYelpのレビューデータを結合する ~/.pyenv/versions/3.7.0/lib/python3.7/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds) 3192 else: 3193 values = self.astype(object).values -> 3194 mapped = lib.map_infer(values, f, convert=convert_dtype) 3195 3196 if len(mapped) and isinstance(mapped[0], Series): pandas/_libs/src/inference.pyx in pandas._libs.lib.map_infer() <ipython-input-33-cbf28bafe369> in <lambda>(x) 11 12 # YelpのビジネスデータからcategoriesがNightlife(ナイトライフ@<fn>{nightlife})またはRestaurants(レストラン)のデータを取り出し ---> 13 filter_func = lambda x: len(set(x) & set(['Nightlife', 'Restaurants'])) > 0 14 twobiz = biz_df[biz_df['categories'].apply(filter_func)] 15 TypeError: 'NoneType' object is not iterable

該当のソースコード

python

1import json 2import pandas as pd 3 4# Yelpのビジネスデータを読み込み 5with open('data/yelp/yelp_academic_dataset_business.json') as biz_f: 6 biz_df = pd.DataFrame([json.loads(x) for x in biz_f.readlines()]) 7 8# Yelpのレビューデータを読み込み 9with open('data/yelp/yelp_academic_dataset_review.json') as review_file: 10 review_df = pd.DataFrame([json.loads(x) for x in review_file.readlines()]) 11 12# YelpのビジネスデータからcategoriesがNightlife(ナイトライフ)またはRestaurants(レストラン)のデータを取り出し 13filter_func = lambda x: len(set(x) & set(['Nightlife', 'Restaurants'])) > 0 14twobiz = biz_df[biz_df['categories'].apply(filter_func)] 15 16# 取り出した2つのカテゴリのYelpのビジネスデータとYelpのレビューデータを結合する 17twobiz_reviews = twobiz.merge(review_df, on='business_id', how='inner') 18 19# 必要ない特徴量を排除 20twobiz_reviews = twobiz_reviews[['business_id', 'name', 'stars_y', 'text', 'categories']] 21 22# target列を作成。categoriesがNightlifeの時はTrue、それ以外の場合はFalse 23twobiz_reviews['target'] = twobiz_reviews['categories'].apply(set(['Nightlife']).issubset) 24 25twobiz

試したこと

Pandasについて色々調べたのですが、うまく行きそうにないです。

filter_func = lambda x: len(set(x) & set(['Nightlife', 'Restaurants'])) > 0 twobiz=biz_df.dropna(subset=["categories"]) twobiz = twobiz[twobiz.categories.str.contains('(Nightlife|Restaurants)')] twobiz=twobiz[twobiz.categories.apply(lambda x:x.split(","))] twobiz=twobiz[twobiz["categories"].apply(filter_func)]

と処理したら

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-35-1f4862fe075d> in <module> 16 twobiz=biz_df.dropna(subset=["categories"]) 17 twobiz = twobiz[twobiz.categories.str.contains('(Nightlife|Restaurants)')] ---> 18 twobiz=twobiz[twobiz.categories.apply(lambda x:x.split(","))] 19 twobiz=twobiz[twobiz["categories"].apply(filter_func)] 20 # # for i in range(len(twobiz.categories)): ~/.pyenv/versions/3.7.0/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key) 2680 if isinstance(key, (Series, np.ndarray, Index, list)): 2681 # either boolean or fancy integer index -> 2682 return self._getitem_array(key) 2683 elif isinstance(key, DataFrame): 2684 return self._getitem_frame(key) ~/.pyenv/versions/3.7.0/lib/python3.7/site-packages/pandas/core/frame.py in _getitem_array(self, key) 2724 return self._take(indexer, axis=0) 2725 else: -> 2726 indexer = self.loc._convert_to_indexer(key, axis=1) 2727 return self._take(indexer, axis=1) 2728 ~/.pyenv/versions/3.7.0/lib/python3.7/site-packages/pandas/core/indexing.py in _convert_to_indexer(self, obj, axis, is_setter) 1312 # unique index 1313 if labels.is_unique: -> 1314 indexer = check = labels.get_indexer(objarr) 1315 1316 # non-unique (dups) ~/.pyenv/versions/3.7.0/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_indexer(self, target, method, limit, tolerance) 3257 'backfill or nearest reindexing') 3258 -> 3259 indexer = self._engine.get_indexer(target._ndarray_values) 3260 3261 return _ensure_platform_int(indexer) pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_indexer() pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.lookup() TypeError: unhashable type: 'list'

と出てお手上げです。どこでハッシュ化しているかがわかりません...

補足情報(FW/ツールのバージョンなど)

Python3.7.0
データセット https://www.yelp.com/dataset/download
もしくは https://www.kaggle.com/yelp-dataset/yelp-dataset/downloads/yelp-dataset.zip/9

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

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

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

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

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

guest

回答2

0

ベストアンサー

set(x) ではなく set([x]) としてください。 ※書籍ではどうなっていますか?

python

1filter_func = lambda x: len(set([x]) & set(['Nightlife', 'Restaurants'])) > 0

投稿2019/08/10 05:25

meg_

総合スコア10580

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

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

kyouyaP

2019/08/10 08:08

書籍通りの記述をしています! (https://github.com/HOXOMInc/feature-engineering-bookのjupyter notebookとほぼ同じです、fileのパス通す場所を変えています!) meg_さんの言う通りにしたら一応抽出が行えたのですが、抽出されたデータ数がとても少なくなってしまっています...
meg_

2019/08/10 08:31

# YelpのビジネスデータからcategoriesがNightlife(ナイトライフ)またはRestaurants(レストラン)のデータを取り出し 抽出結果は上記の文章の内容とは一致してますか?
kyouyaP

2019/08/10 08:35

一致しません,,, 本来期待されるcategoriesの出力は「[Sushi Bars, Restaurants, Japanese]」といった形式ですが、meg_さんのおっしゃる通りに実行すると「Sushi Bars, Restaurants, Japanese」といった形式になります
meg_

2019/08/10 08:42

「twobiz」の内容が「categories」列が【NightlifeまたはRestaurants】であるDataFrameになりましたか? それがあっているなら、今回の質問の内容は解決したと思います。
kyouyaP

2019/08/10 08:48

そうなったと思います!回答ありがとうございます!
guest

0

演習本はFeature Engineering for Machine Learningでしょうか?であれば書籍のとおりのコードに書き直すか
filter_func = lambda x: bool(set(x) & {'Nightlife', 'Restaurants'})でよいかと思います。

投稿2019/08/09 17:37

can110

総合スコア38266

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

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

kyouyaP

2019/08/09 23:52

ありがとうございます!試して見ます!誤植だったんですね、、、!
kyouyaP

2019/08/10 05:07 編集

filter_func = lambda x: bool(set(x) & {'Nightlife', 'Restaurants'})にしたところ 同様のエラーが起きました... ``` --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-51f4636a2d6a> in <module> 12 # YelpのビジネスデータからcategoriesがNightlife(ナイトライフ)またはRestaurants(レストラン)のデータを取り出し 13 filter_func = lambda x: bool(set(x) & {'Nightlife', 'Restaurants'}) ---> 14 twobiz = biz_df[biz_df['categories'].apply(filter_func)] 15 16 # 取り出した2つのカテゴリのYelpのビジネスデータとYelpのレビューデータを結合する ~/.pyenv/versions/3.7.0/lib/python3.7/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds) 3192 else: 3193 values = self.astype(object).values -> 3194 mapped = lib.map_infer(values, f, convert=convert_dtype) 3195 3196 if len(mapped) and isinstance(mapped[0], Series): pandas/_libs/src/inference.pyx in pandas._libs.lib.map_infer() <ipython-input-4-51f4636a2d6a> in <lambda>(x) 11 12 # YelpのビジネスデータからcategoriesがNightlife(ナイトライフ)またはRestaurants(レストラン)のデータを取り出し ---> 13 filter_func = lambda x: bool(set(x) & {'Nightlife', 'Restaurants'}) 14 twobiz = biz_df[biz_df['categories'].apply(filter_func)] 15 TypeError: 'NoneType' object is not iterable ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問