やりたきこと
- 「年収」が◯万円、◯億円、◯億◯万円というようにテキストで入力されたものを「年収」数値順にソートしたい。
- 「年」が19年のように二桁のテキストで入力されているものを、2019年のように4桁にした上で「年」順にソートしたい
データ
課題
数値ではなく、文字で入力されているため、年収カラムによるデータのソートが出来ない。
使用言語
Python + Jupyter Notebook + Pandas
Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。
Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。
データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます
Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。
Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。
Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。
Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。
データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます
Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。
Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。
0グッド
1クリップ
投稿2020/02/05 07:08
数値ではなく、文字で入力されているため、年収カラムによるデータのソートが出来ない。
Python + Jupyter Notebook + Pandas
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/05 07:52
2020/02/05 08:23 編集
回答3件
0
eval
で手抜きした例です。
Python
1import pandas as pd 2from io import StringIO 3 4def to_num(s): 5 s = s.replace('円','') 6 s = s.replace('万','*10000+') 7 s = s.replace('億','*100000000+') 8 if s[-1] == '+': 9 s += '0' 10 return eval(s) # 手抜き 11 12def to_year(s): 13 return 2000 + int(s.replace('年','')) 14 15# サンプルデータ 16s = """name,price,year 17a,123円,17年 18b,123万円,18年 19c,123億円,19年 20d,12億3400万円,20年""" 21df = pd.read_csv(StringIO(s)) 22print(df) 23 24df['price'] = df['price'].apply(to_num) 25df['year'] = df['year'].apply(to_year) 26df = df.sort_values('price', ascending=False) 27 28print(df) 29# name price year 30#2 c 12300000000 2019 31#3 d 1234000000 2020 32#1 b 1230000 2018 33#0 a 123 2017
投稿2020/02/05 09:26
総合スコア38350
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
正規表現 (DataFrame.str.extract()
)などを使って、数値を切り出して再計算すると良いかと思います。
Python
1import pandas as pd 2 3df = pd.DataFrame([ 4 ['武','3000万円', '19年'], 5 ['隆','1億円', '18年'], 6 ['良太郎','200万円', '20年'], 7 ['弘','20億円', '18年'], 8 ['花子','1億2000万円', '19年'], 9 ['将兵','9000万1000円', '16年'], 10], columns=['名前','年収','年']) 11 12tmp = df['年収'].str.extract(r'(?:(?P<億>\d+)億)?(?:(?P<万>\d+)万)?(?P<円>\d+)?円').fillna(0).astype(int) 13df['年収'] = tmp['億'] * 100000000 + tmp['万'] * 10000 + tmp['円'] 14print(df) 15# 名前 年収 年 16#0 武 30000000 19年 17#1 隆 100000000 18年 18#2 良太郎 2000000 20年 19#3 弘 2000000000 18年 20#4 花子 120000000 19年 21#5 将兵 90001000 16年
【追記】
"年"列の変換も追加したサンプル
import pandas as pd df = pd.DataFrame([ ['武','3000万円', '19年'], ['隆','1億円', '18年'], ['良太郎','200万円', '20年'], ['弘','20億円', '18年'], ['花子','1億2000万円', '19年'], ['将兵','9000万1000円', '16年'], ], columns=['名前','年収','年']) tmp = df['年収'].str.extract(r'(?:(?P<億>\d+)億)?(?:(?P<万>\d+)万)?(?P<円>\d+)?円').fillna(0).astype(int) df['年収'] = tmp['億'] * 100000000 + tmp['万'] * 10000 + tmp['円'] df['年'] = df['年'].str.extract(r'(\d+)年').astype(int) * 100 print(df) # 名前 年収 年 #0 武 30000000 1900 #1 隆 100000000 1800 #2 良太郎 2000000 2000 #3 弘 2000000000 1800 #4 花子 120000000 1900 #5 将兵 90001000 1600
投稿2020/02/05 08:22
編集2020/02/05 23:19総合スコア15898
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。