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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

pandas

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

Q&A

3回答

1733閲覧

文字で入力されている数値を降順でソートしたい

Ponta2929

総合スコア16

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

pandas

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

0グッド

1クリップ

投稿2020/02/05 07:08

やりたきこと

  1. 「年収」が◯万円、◯億円、◯億◯万円というようにテキストで入力されたものを「年収」数値順にソートしたい。
  2. 「年」が19年のように二桁のテキストで入力されているものを、2019年のように4桁にした上で「年」順にソートしたい

データ

イメージ説明

課題

数値ではなく、文字で入力されているため、年収カラムによるデータのソートが出来ない。

使用言語

Python + Jupyter Notebook + Pandas

欲しいアウトプット

上の形に出来るのが理想ですが、もし難しければ下でも大丈夫です。
イメージ説明

2
イメージ説明

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

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

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

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

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

coco_bauer

2020/02/05 07:52

億とか万とかで区切って、いったん2つ目の表のような数値に直し、ソート後に数値を億万の入った文字列に戻すのが順当な方法だと思います。 で、何ができなくて問題が解決しないのですか?
Ponta2929

2020/02/05 07:56

割り算などで数値を治す方法は分かったのですが、テキストの単位で、かつ、様々なパターンがある場合にどう数値に直す、文字列に戻すのかが分かりません。 初心者でごめんなさい...
magichan

2020/02/05 08:23 編集

間違ってこちらに回答を投稿してしまった・・ ということで削除しましたので、気にしないでください
guest

回答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

can110

総合スコア38341

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

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

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
magichan

総合スコア15898

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

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

magichan

2020/02/05 10:50

年の変換はすっかり見落としてました。。。 こちらも正規表現を使って df['年'] = df['年'].str.extract(r'(\d+)年').astype(int) * 100 で良いかと思います。
Ponta2929

2020/02/05 13:50

年収は出来ました!ありがとうございます。 毎回素晴らしい回答を頂きありがとうぎざます。 年については、こちらでやってみると 'int' object has no attribute 'str' というエラーが出て出来なさそうでした。
magichan

2020/02/05 23:22

あれ?なんでだろ 一応、年の変換部も加えた動作サンプルを回答に追記しておきましたのでご確認ください。 元の"年"列は文字列が格納された列なので .str attribute は存在するはずですし、そもそも 'int' objectではないので 'int' object has no attribute 'str' となるはずはないのですが。
guest

0

年の部分は簡単ですね、年の文字を消して2000を足すだけです
(ただ、良太郎の変換が間違っているようですが…?)

年収はたくさんのパターンがあるように見えますが、実は3通りしかありません
「a億」「a億b万」「b万」

3通りしかないので、どのパターンに一致するのかを場合分けして、
それぞれの場合に応じて変換していけばいいと思います

投稿2020/02/05 08:30

izmktr

総合スコア2856

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問