前提・実現したいこと
機械学習のための特徴量エンジニアリングの演習を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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/10 08:08
2019/08/10 08:31
2019/08/10 08:35
2019/08/10 08:36
2019/08/10 08:42
2019/08/10 08:48