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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

4293閲覧

DataFrame: df1の要素とdf2の要素をマッチングさせdf1に新しい要素を加えたい。

tatpka

総合スコア17

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/12/18 05:02

前提・実現したいこと

事業所のデータ
df1 = pd.DataFrame({
"office":["a","b","c","d"],
"address":["堺市堺区","練馬区","川崎市中原区", "千代田区"],
"year":[2016,2017,2016,2018]})

市区町村ごとの地価データ
df2 = pd.DataFrame({
"place":["大阪府大阪市此花区", "大阪府堺市堺区", "東京都品川区","東京都練馬区","川崎市中原区","東京都千代田区","大阪府大阪市此花区", "大阪府堺市堺区"],
"year":[2017,2017,2016,2017,2016,2018,2016,2016],
"price"["100万","20万","130万","90万","70万","200万","80万","15万"]})

において、
1 [事務所iの"address"と地価データの"place"]および[事務所iの"year"と地価データの"year"]の二つの条件をつけて、
2 地価データの地価("price")を検索し、
3 見つけた"price"を事務所データに新しい列"price"として追加したいです。

どのようなコードを組めば回すことができるでしょうか。

補足:実際には事務所データは2万、地価データは4000程度あるので、できるだけ早く処理できるコードが大変ありがたいです。

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

何度か試みましたが、事務所データに"price"列を作ることはできませんでした。

該当のソースコード

python

1 2from tqdm import tqdm 3 4for i in tqdm(range(len(df1))): 5 if df.loc[i,"year"] == 2018: 6 for j in range(len(df2)): 7 if df.loc[i,"address"] in str(df2.loc[j,"place"]): 8 df.loc[i,"price"] = df2.loc[j,"price"] 9for i in tqdm(range(len(df1))): 10 if df.loc[i,"year"] == 2017: 11 for j in range(len(df2)): 12 if df.loc[i,"address"] in str(df2.loc[j,"place"]): 13 df.loc[i,"price"] = df2.loc[j,"price"] 14 15for i in tqdm(range(len(df1))): 16 if df.loc[i,"year"] == 2016: 17 for j in range(len(df2)): 18 if df.loc[i,"address"] in str(df2.loc[j,"place"]): 19 df.loc[i,"price"] = df2.loc[j,"price"] 20

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

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じでどうでしょう

Python3

1address_to_place = { 2 address: place 3 for address in df1['address'] 4 for place in df2['place'] 5 if place.endswith(address) 6} 7result = df1.copy() 8result['place'] = df1['address'].apply(address_to_place.get) 9result = pd.merge(result, df2, on=['place', 'year']) 10result = result.drop(columns=['place']) 11 12print(result)
office address year price 0 a 堺市堺区 2016 15万 1 b 練馬区 2017 90万 2 c 川崎市中原区 2016 70万 3 d 千代田区 2018 200万

投稿2018/12/18 06:19

kzm4269

総合スコア184

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

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

tatpka

2018/12/19 02:25

ありがとうございます!辞書作って結合させるってのがわかりやすかったです! 無事結合に成功しました!
guest

0

ちょっと内容が込み入っているので、分けますが、

まず、ちょっとデータに表記ブレが見受けられます。
具体的には、堺市堺区と大阪府堺市堺区や東京都練馬区など、都道府県つきかそうでないかがまちまちになっているので、これを統一し、(説明のために事務所eのデータを1つ追加して)以下のデータを前提にします

python

1# 事務所データ? 2df1 = pd.DataFrame({ 3"office":["a","b","c","d","e"], 4"address":["堺市堺区","練馬区","川崎市中原区", "千代田区","千代田区"], 5"year":[2016,2017,2016,2018,2017]}) 6 7# 市区町村ごとの地価データ 8df2 = pd.DataFrame({ 9"place":["大阪市此花区", "堺市堺区", "品川区","練馬区","川崎市中原区","千代田区","大阪市此花区", "堺市堺区","千代田区"], 10"year":[2017,2017,2016,2017,2016,2018,2016,2016,2017], 11"price":["100万","20万","130万","90万","70万","200万","80万","15万","1万"]}) 12

実際に作業される際は、この観点でデータを一旦綺麗にしてから行ったほうがいいでしょう。

ある条件のもとに表の内容同士を結びつけるのはpandas.merge()で行えます。
今回の場合は左外部結合になると思いますので、

python

1import pandas as pd 2 3# ここに何らかの手段で上のDataFrameを読み込むコードを挿入してください 4df3 = pd.merge(df1, df2, left_on='address', right_on='place',how='left') 5

こうすると、市区町村のみで条件付けして表ができます。すなわち[事務所iの"address"と地価データの"place"]の条件ですね。

pandas

1 2 address office year_x place price year_y 30 堺市堺区 a 2016 堺市堺区 20万 2017 41 堺市堺区 a 2016 堺市堺区 15万 2016 52 練馬区 b 2017 練馬区 90万 2017 63 川崎市中原区 c 2016 川崎市中原区 70万 2016 74 千代田区 d 2018 千代田区 200万 2018 85 千代田区 d 2018 千代田区 1万 2017 96 千代田区 e 2017 千代田区 200万 2018 107 千代田区 e 2017 千代田区 1万 2017

これだともうひとつの条件が入らないのですが、残念ながらDataFrameは複数の条件で結合する作りになっていません。

なので、条件を加えて抽出してやります。これが[事務所iの"year"と地価データの"year"]にあたります。

Python

1df4 = df3[df3['year_x'] == df3['year_y']]

これで、お望みの結果が入ったDataFrame df4ができました。
あとは余計な列が入っているので、

Python

1del df4['year_y'] 2del df4['place']

などとしてやればいいでしょう。

投稿2018/12/18 07:20

sietedm

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問