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

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

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

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

Q&A

解決済

1回答

594閲覧

Python 価格予測解析

Tanutanu

総合スコア1

Python

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

0グッド

0クリップ

投稿2022/08/21 10:40

編集2022/08/21 11:17

マンションの価格予測解析を行うにあたって、以下リンク先のページを参考にさせて頂いています。

https://note.com/maytakesao/n/n126165676d30

このうち、《変更前コード》において、

《変更前エラー》

Python

1--------------------------------------------------------------------------- 2TypeError Traceback (most recent call last) 3<ipython-input-29-63695056f7a7> in <module> 4 2 df_data_normal = df_data_normal[df_data_normal['種類'] == '中古マンション等'] 5 3 #面積(㎡)⇒120以内を使う, 最寄駅:距離(分)⇒30以内を使う,建築年(西暦) ⇒1950年以上を使う 6----> 4 df_data_normal = df_data_normal.loc[df_data_normal['面積(㎡)'] <=120] 7 5 df_data_normal = df_data_normal.loc[df_data_normal['最寄駅:距離(分)'] <=30] 8 6 df_data_normal = df_data_normal.loc[df_data_normal['建築年(西暦)'] >= 1950] 9 105 frames 11/usr/local/lib/python3.7/dist-packages/pandas/_libs/ops.pyx in pandas._libs.ops.scalar_compare() 12 13TypeError: '<=' not supported between instances of 'str' and 'int'

というエラーが出ます。

そこで、astypeを用いて、文字列(str)から整数(int)に変換を試み、
《変更後コード》のように記載したところ、'面積(㎡)'に対してKeyerrorが出てしまい、
実行できませんでした。解決方法を教えて頂けるとありがたいです。

《変更後エラー》

Python

1--------------------------------------------------------------------------- 2KeyError Traceback (most recent call last) 3<ipython-input-28-add3df40f807> in <module> 4 2 df_data_normal = df_data_normal[df_data_normal['種類'] == '中古マンション等'] 5 3 #面積(㎡)⇒120以内を使う, 最寄駅:距離(分)⇒30以内を使う,建築年(西暦) ⇒1950年以上を使う 6----> 4 df['面積(㎡)'] = df['面積(㎡)'].astype(int) 7 5 df['最寄駅:距離(分)'] = df['最寄駅:距離(分)'].astype(int) 8 6 df['建築年(西暦)'] = df['建築年(西暦)'].astype(int) 9 102 frames 11/usr/local/lib/python3.7/dist-packages/pandas/core/indexes/range.py in get_loc(self, key, method, tolerance) 12 386 except ValueError as err: 13 387 raise KeyError(key) from err 14--> 388 raise KeyError(key) 15 389 return super().get_loc(key, method=method, tolerance=tolerance) 16 390 17 18KeyError: '面積(㎡)'

《変更前コード》

Python

1#中古マンション等のみ抽出 2df_data_normal = df_data_normal[df_data_normal['種類'] == '中古マンション等'] 3#面積(㎡)⇒120以内を使う, 最寄駅:距離(分)⇒30以内を使う,建築年(西暦) ⇒1950年以上を使う 4df_data_normal = df_data_normal.loc[df_data_normal['面積(㎡)'] <=120] 5df_data_normal = df_data_normal.loc[df_data_normal['最寄駅:距離(分)'] <=30] 6df_data_normal = df_data_normal.loc[df_data_normal['建築年(西暦)'] >= 1950]

《変更後コード》

Python

1#中古マンション等のみ抽出 2df_data_normal = df_data_normal[df_data_normal['種類'] == '中古マンション等'] 3#面積(㎡)⇒120以内を使う, 最寄駅:距離(分)⇒30以内を使う,建築年(西暦) ⇒1950年以上を使う 4df['面積(㎡)'] = df['面積(㎡)'].astype(int) 5df['最寄駅:距離(分)'] = df['最寄駅:距離(分)'].astype(int) 6df['建築年(西暦)'] = df['建築年(西暦)'].astype(int) 7df_data_normal = df_data_normal.loc[df_data_normal[df['面積(㎡)'] <=120]] 8df_data_normal = df_data_normal.loc[df_data_normal[df['最寄駅:距離(分)'] <=30]] 9df_data_normal = df_data_normal.loc[df_data_normal[df['建築年(西暦)'] >= 1950]]

よろしくおねがいします。

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

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

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

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

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

meg_

2022/08/21 10:50 編集

コードが見にくいので、「コードの挿入」で記入してください。 > うまくいかず どの箇所が”どう”上手く行かないのでしょうか?
can110

2022/08/21 11:02

エラーは表示されたもの(Traceback)をすべて提示ください。 また、エラーが発生するところまででよいので、実行可能な完全なコードを提示すると回答得られやすくなります。 なお、参考サイトでは「最寄駅:距離(分)」列などのデータクレンジング処理に関するコードが省略されているようです。
can110

2022/08/21 11:19

「df_data_normal」と「df」は同じモノでしょうか?
meg_

2022/08/21 11:36

> KeyError: '面積(㎡)' 上記が出たときに print(df.columns) を実行して、カラム名の差異を確認するとエラーの原因が分かるかと思います。
Tanutanu

2022/08/21 13:22

>can110さん 理解が不十分で質問に回答できず申し訳ありません。 丁寧なアドバイスありがとうございました。助かりました。 >megさん 使用方法、確認方法等コメントありがとうございました。助かりました。
guest

回答1

0

ベストアンサー

それぞれのカラムに、数字以外の文字が含まれています。例えば、

python

1>>> print(df_data_normal['面積(㎡)'].unique()) 2['80' '110' '280' '70' '220' '75' '65' '85' '20' '140' '35' '60' '50' '55' 3 '180' '130' '150' '45' '90' '250' '350' '260' '210' '460' '15' '120' 4 '100' '730' '880' '115' '95' '40' '135' '30' '200' '185' '160' '105' 5 '175' '330' '25' '155' '125' '165' '380' '1300' '1400' '570' '290' '1100' 6 '390' '145' '190' '170' '500' '310' '195' '410' '2000㎡以上' '850' '270' 7 : 8 9>>> print(df_data_normal['最寄駅:距離(分)'].unique()) 10['7' '10' '13' '8' '11' '14' '2' '5' '6' '4' '9' '12' '3' '16' '18' '1' 11 nan '15' '19' '21' '25' '20' '24' '30分?60分' '23' '26' '28' '17' '22' '29' 12 '2H?' '0' '27' '1H?1H30']

整数値に変換できない場合は部分文字列だけを変換したり、nan に置き換えます。

python

1import pandas as pd 2 3pd.set_option('display.unicode.east_asian_width', True) 4 5df_data_normal = pd.read_csv('13121_20101_20203.csv', encoding="cp932") 6 7df_data_normal['面積(㎡)'] = df_data_normal['面積(㎡)'].replace(r'(\d+).*以上', r'\1', regex=True).astype(int) 8df_data_normal['最寄駅:距離(分)'] = pd.to_numeric(df_data_normal['最寄駅:距離(分)'], errors='coerce') 9df_data_normal['建築年(西暦)'] = df_data_normal['建築年'].replace({ 10 '昭和': '1925@', '平成': '1988@', '令和': '2018@', 11 '元年': '0', '年': '', r'(\d+)': r'\1' 12}, regex=True).str.split('@', expand=True).dropna(how='any').astype(int).sum(axis=1) 13 14condition = ( 15 # 中古マンション等のみ 16 (df_data_normal['種類'] == '中古マンション等') & 17 # 面積(㎡)⇒120以内 18 (df_data_normal['面積(㎡)'] <= 120) & 19 # 最寄駅:距離(分)⇒30以内 20 (df_data_normal['最寄駅:距離(分)'] <= 30) & 21 # 建築年(西暦) ⇒1950年以降 22 (df_data_normal['建築年(西暦)'] >= 1950)) 23 24df_data_normal = df_data_normal[condition] 25print(df_data_normal)

投稿2022/08/21 12:08

編集2022/08/21 12:13
melian

総合スコア19703

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

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

Tanutanu

2022/08/21 13:17 編集

早速丁寧にご回答頂きありがとうございました。大変助かりました。 置き換え方法の部分は、もう一度よく確認するようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問