データに含まれる文字の一括変換方法
Q&A
Closed
追記
回答を元に完成できました。ありがとうございます。
https://qiita.com/wellwell3176/items/5c94871b5e059fce1e3d
解決したいこと
データに含まれる特定の文字列を抽出・変換したい。
例えば表1のようなデータが有り、データは「名前+復数の記号」で構成されている。
これに対して、表2のような変換表を用いて、表3のようなデータを作りたい。
表1 生データ df_raw
No. | 馬名 |
---|---|
1 | コシヒカリ○③ |
2 | ササニシキ◎ |
3 | ヨモギダンゴ✕② |
4 | タナカタロウ① |
表2 変換表
key | value | key | value |
---|---|---|---|
① | 1番 | ◎ | 本命 |
② | 2番 | ○ | 対抗 |
③ | 3番 | ✕ | 大穴 |
表3 作りたいデータフレーム
No. | 馬名 | 新聞予想 | 自分予想 |
---|---|---|---|
1 | コシヒカリ | 対抗 | 3番 |
2 | ササニシキ | 本命 | |
3 | ヨモギダンゴ | 大穴 | 2番 |
4 | タナカタロウ | 1番 |
自分で試したこと
今は変換表を使わず力技で実装しているのですが、これだとメンテナンスが大変なので、
変換表をCSVとして読み込んで、そのデータをもとに変換を掛けたい状況です。
自作
import pandas as pd
df = pd.DataFrame(
data=[{
'No.': 1,
'horse': 'コシヒカリ○③',
}, {
'No.': 2,
'horse': 'ササニシキ◎',
}, {
'No.': 3,
'horse': 'ヨモギダンゴ✕②',
}, {
'No.': 4,
'horse': 'タナカタロウ①',
}])
df_shinbun=df["horse"].str.extract("(○|◎|✕)").replace("◎","本命").replace("○","対抗").replace("✕","大穴").fillna("")
df_kojin=df["horse"].str.extract("(①|②|③)").replace("①","一番").replace("②","二番").replace("③","三番").fillna("")
df["horse"]=df["horse"].str.replace("○|◎|✕|①|②|③","",regex=True)
df_complete=pd.concat([df,df_shinbun,df_kojin],axis=1)
df_complete.columns=("No.","horse","新聞予想","個人予想")
結果として出力される表(表3と一致しているので、ひとまずこれを使っている)
No. | horse | 新聞予想 | 個人予想 |
---|---|---|---|
1 | コシヒカリ | 対抗 | 三番 |
2 | ササニシキ | 本命 | |
3 | ヨモギダンゴ | 大穴 | 二番 |
4 | タナカタロウ | 一番 |
追記
自作
dictionary_data = pd.read_excel("hogehoge.xlsx")
df_dict=dictionary_data.to_dict()
表2を格納したhogehoge.xlsxに対して、to_dict()を行うことで辞書データへの変換はできた。
0