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

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

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

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

Q&A

解決済

1回答

4180閲覧

あるデータフレームの特定の列を変換テーブルを利用して別の文字列に置き換える:Pandas

pepasuke623

総合スコア55

Python 3.x

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

0グッド

1クリップ

投稿2017/10/12 13:27

###前提・実現したいこと
毎度お世話になります。

あるデータフレームの特定の列を変換テーブルを利用して別の文字列に置き換える,
ということがしたいです。
具体的には次のとおりです。

まず,下記のような対象となるデータがあるとします。

// 対象のデータ Id hoge 0 956567041061059 huga1 1 756567041061059 huga2 2 111111111111111 huga3

Id列の文字が比較的長い整数であることが特徴です。

このId列を次の「変換テーブル」の”serial_num”列をを参照して,別の名前に変えたいと思っています。

(hoge列は今回は関係ありません)

// 変換テーブル serial_num No name 0 956567041061059 1 matu 1 756567041061059 2 take 2 656567041061059 3 ume

「対象のデータ」1行目の”Id”が の「変換テーブル」1行目の”serial_num”と一致しているので,「対象のデータ」1行目の”Id”に「変換テーブル」1行目の”name”の"matu"を代入します。
同じく「対象のデータ」2行目の”Id”が の「変換テーブル」2行目の”serial_num”と一致しているので,「対象のデータ」1行目の”Id”に「変換テーブル」1行目の”name”の"take"を代入します。
「対象のデータ」の三行目の”111111111111111”のように「変換テーブル」に存在しない文字列は”null”に変換したいと思っています。

変換後は次のようになります。

// 変換後のデータ   Id hoge 0 matu huga1 1 take huga2 2 null huga3

###試したこと
こんな感じのコードを書いてみました。

python

1import pandas as pd 2 3 4df = pd.DataFrame({ 'Id' : [956567041061059,756567041061059,656567041061059], 5 'hoge' : ["huga1","huga2","huga3"], # この列は関係ない 6 }) 7 8table = pd.DataFrame({ 'No' : [1,2,3], 9 'serial_num' : [956567041061059,756567041061059,656567041061059], 10 'name' : ["matu","take","ume"], 11 }) 12 13def change(val): 14 # ここらへんが怪しい 15 dff = pd.DataFrame( 16 table[ table['serial_num']==int(val)] 17 ) 18 name_ = dff.ix[0,2] 19  # ここまでが怪しいので”null”に変換するコードが実装できていない 20 return name_ 21 22df['Id'] = df['Id'].apply(change)

型が一致していないのか「KeyError: 0」とでてしまいます。

無理やりStringにしてみたり,intにしてみたりと色々試してみましたが,イマイチよく分かりません。
ぜひともご教示いただければと思います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

このような用途には pandas.merge() をお使いください。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.merge.html

左側(df1)のId列と 右側(df2)のserial_num列でmergeを行い、左側(df1)の行が全て残るように指定(how='reft')しております。

あとは余分な列の削除drop()と、一部の列の名前を変更rename()を行っております。

Pyrhon

1import pandas as pd 2df1 = pd.DataFrame({'Id': [956567041061059, 756567041061059, 111111111111111], 3 'hoge':['hoge1','hoge2','hoge3']}) 4df2 = pd.DataFrame({'serial_num': [956567041061059,756567041061059, 656567041061059], 5 'No': [1,2,3], 6 'name': ['matu','take','ume']}) 7 8result = pd.merge(df1,df2,left_on='Id',right_on='serial_num',how='left').drop(['Id','serial_num','No'],axis=1).rename(columns={'hoge': 'Id'}) 9print(result) 10# => Id name 11# 0 hoge1 matu 12# 1 hoge2 take 13# 2 hoge3 NaN

投稿2017/10/12 16:02

magichan

総合スコア15898

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

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

pepasuke623

2017/10/13 04:35

ありがとうございます!確かに出来ました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問