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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

3638閲覧

Python で2つのDataFrameをExcelのVlookupのように対応させたい。

norimaro_python

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2020/06/08 14:59

よくアンケートをとるのですが、アンケートの質問で

(例)
Q.どのメーカーの車に乗っていますか?
A.2

というように、回答が 2 というふうに数字で帰ってくる設計のアンケート多いのですが、ExcelではVlookupを使えばすぐできるのですが、Pythonを使って2つのCSVもしくはExcelを読み込んでDataFrameを下記のようにしたいです。

アンケート回答結果 (df1)

年齢を数字で回答してもらい、メーカーも数字で回答してもらっている。
イメージ説明

アンケートの回答に対応する別のデーター (df2)

イメージ説明

Pythonでアンケート回答結果(df1)と(df2)加工して下記のようにDataFrameを作りたい(df3)

下表の赤で囲んだカラムをExcelのvlookupのように「年齢層」は「年齢番号」から引っ張ってきて、
「メーカー名」は「メーカーNo.」から引っ張ってきて、横に分かりやすいようにカラムを付け加えたいです。

イメージ説明

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

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

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

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

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

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

norimaro_python

2020/06/10 01:41

なるほどですね。ありがとうございます。助かります。
guest

回答2

0

ベストアンサー

Python

1maker_tbl = df2.loc[df2['項目'] == 'メーカーNo.', 'メーカーNo.':].set_index('メーカーNo.', drop=True).iloc[:,0]

のような処理を施すことで

メーカーNo
1トヨタ
2ホンダ
3日産
4三菱
5フェラーリ
6ジャガー

のようなSeriesデータを作成できますので、後は

Python

1df1['メーカー名'] = df1['メーカー'].map(maker_tbl)

のようにSeries.map()にて引き当てると良いと思います。
(年齢層も全く同じ処理でいけます。)

以下、動作サンプル

Python

1import pandas as pd 2import numpy as np 3 4N = 10 5df1 = pd.DataFrame( 6{ 7 '年齢' : np.random.randint(1,7,N), 8 'メーカー' : np.random.randint(1,7,N) 9}) 10 11df2 = pd.DataFrame({ 12 '項目': ['メーカーNo.'] * 6 + ['年齢層'] * 6, 13 'メーカーNo.': [1,2,3,4,5,6,1,2,3,4,5,6], 14 '?': ['トヨタ','ホンダ','日産','三菱','フェラーリ','ジャガー', 15 '10代','20代','30代','40代','50代','60代'] 16}) 17 18maker_tbl = df2.loc[df2['項目'] == 'メーカーNo.', 'メーカーNo.':].set_index('メーカーNo.', drop=True).iloc[:,0] 19age_tbl = df2.loc[df2['項目'] == '年齢層', 'メーカーNo.':].set_index('メーカーNo.', drop=True).iloc[:,0] 20 21df1['年齢層'] = df1['年齢'].map(age_tbl) 22df1['メーカー名'] = df1['メーカー'].map(maker_tbl) 23print(df1) 24# 年齢 メーカー 年齢層 メーカー名 25#0 1 5 10代 フェラーリ 26#1 4 2 40代 ホンダ 27#2 2 4 20代 三菱 28#3 1 2 10代 ホンダ 29#4 2 1 20代 トヨタ 30#5 2 3 20代 日産 31#6 1 3 10代 日産 32#7 3 4 30代 三菱 33#8 3 3 30代 日産 34#9 1 5 10代 フェラーリ

投稿2020/06/09 00:06

magichan

総合スコア15898

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

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

0

このページに同様の例と、引数の解説も入っていますので、参考にしてください!

2列あると思いますので、同様の作業を2回実行すると2列結合すると思います。

https://qiita.com/hikaru_/items/e9c1356f674f2baa9e64

投稿2020/06/08 21:29

編集2020/06/08 21:31
jiaetakoga

総合スコア96

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問