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

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

ただいまの
回答率

90.61%

  • Python

    7513questions

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

  • Python 3.x

    5924questions

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

  • Geolocation

    25questions

    Geolocation(ジオロケーション)は、携帯電話やインターネットに接続したコンピューターターミナルなど、オブジェクトの現実世界での地理的位置の情報を扱う技術であり、位置評価の実施や、実際に評価された位置を示す場合もあります。

Pythonのデータフレームの要素から都市名のみ取り出す

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 207

要素がバラバラに並んだpandasのデータフレームから、Geocoderなどを使って、都市名が存在すればその都市名だけをとりだすことはできるでしょうか?例えば、

df1 = pd.DataFrame({'Information1' : ['New York', 'game','Prof. HANA YAMADA', 'tennis','NICK'],
                    'Information2' : ['books', 24, 'GroupA','A. ELIZABETH JONES.',26],
                    'Information3' : ['Mr. ADAMS', 'Rome', 'Japan', 23,'GroupB'],
                    'Information4' : ['teacher', 'MARCO', 25, 'Moscow','pilot']},
                    index = {'Person 1','Person 2','Person 3', 'Person 4','Person 5'}
                   )


これを出力して

                 Information1       Information2     Information3     Information4
Person 1           New York                books          Mr. ADAMS        teacher
Person 2               game                   24               Rome          MARCO
Person 3    Prof. HANA YAMADA         GroupA             Japan            25
Person 4             tennis         A. ELIZABETH JONES.         23         Moscow
Person 5               NICK                   26               GroupB       pilot


という情報の種類がばらばらに並んだデータフレームdf1とがあるとします。
この、それぞれの人のInformation1からInformation4までで都市名があればその都市名を抽出することはできるでしょうか?
もし都市名が見つからなければ、以下のデータフレームdf2のGroupA~GroupDと一致するGroup名を取り出したいです。

df2= pd.DataFrame({'Number' : [0, 1, 2, 3]},
                   index = {'GroupA','GroupB','GroupC', 'GroupD'}
                   )


これを出力して

          Number
GroupC       0
GroupB       1
GroupD       2
GroupA       3

この、「都市名が見つからなければGroup名をいれる」というのはif関数でできそうですが、
やはり前半の「都市名」のみ取り出す方法がさっぱりわかりません。

最終的に次のようになるのが理想です。

              Place
Person 1    New York
Person 2    Rome
Person 3    GroupA
Person 4    Moscow
Person 5    GroupB


詳しい方がいらっしゃいましたら、ぜひご回答ください。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2018/04/24 20:20

    予め都市名として取り扱う文字列を決めておけばできますが、そういったものはありますか?

    キャンセル

  • python3beginner

    2018/04/24 22:14

    いえ、そのような都市リストは作成しておりません。申し訳ありません…この例ですと5人分ですが、実際扱っているデータは一万を超えてしまっておりなかなかリスト化できないのです…。

    キャンセル

  • hayataka2049

    2018/04/25 00:56 編集

    なるほど、では都市名は首都だけですか? あと、そのデータの出処は? 本来は、上流で然るべき綺麗なフォーマットにして処理すべきですが・・・不可能ですか?

    キャンセル

  • python3beginner

    2018/04/25 01:09

    いえ、首都だけではないのです…複雑で申し訳ありません。こちらは、大昔に調査され紙面にしか残っていないデータをスキャンして取り込んだものです。綺麗なデータセットにするために同じ性格の要素ごとにまとめる一環で都市名など所属のみ取りだそうとしているのですが、やはり難しいですよね…。

    キャンセル

回答 3

checkベストアンサー

+1

最後は人手で手間(コスト)をかけて洗うことになると思いますが、できるだけ手間を省く方法を。

  1. Group*が入っているデータは除去(そのまま決定)

  2. 大文字が含まれる文字列だけ(この辺りの工夫は任意。APIに投げられる回数の制限等があるかどうかにも関わってくるので、それに応じて適当に決めてください)R.shigemoriさんの方法で都市名かどうか判定。googleのAPI(Geocoderはこれのラッパーのはず)を使うならある程度は情報を投げてくれるはずなので、明らかに都市名ではないもの(道路の名前、お店の名前など)は省けると思います。

  3. 方針1か2のどちらか、あるいは別の方法。方法1と2は適当に思いついたものを書いただけです。工夫の余地は色々あると思います。
    方針1:
    重複除去して人手で洗い、都市名として取り扱うリストを作成。これをやるかどうかは任意です。明らかに重複が大量にあるならやる価値はあるかもしれません。
    方針2:
    1データに対して複数の都市名候補が出ちゃったものだけ人手で洗い、都市名を決定。

  4. うまく決まらなかったものを抽出して人手で洗う。

手間は(コーディングでよほど手間取らなければ)ぜんぶ人手でやるよりかなり減らせます。品質は人手より多少下がるかもしれませんが、それほど心配する必要はないと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/25 12:36

    geocoderの実装についてコメントします。
    pythonのラッパー(geocoder)を使う方法もありますが、私はrequestsから直接web-APIを呼ぶ方法を使っています。requestsモジュールを使ったことがあれば、googlemapの仕様に沿って必要なパラメーターを設定するだけなので手間がないかと思います。
    googlemapのgeocoderは優秀すぎるので、あらかじめ地名ではないものを除外する努力をするべきかもしれません。基本、mapに載るもの(ランドマーク)は結果が戻ってくるので、確認が手間になるかもしれません。また、県名だけでも結果が得られますので、都市の定義によってはこうしたものも除外したほうがいいでしょう。

    キャンセル

  • 2018/05/29 01:03

    返答が遅くなり申し訳ありません。コメントありがとうございます、あらかじめ地名でないものを除外できるよう共通要素を見つけて試してみます!

    キャンセル

+1

geocoderで検索をかけて結果が返ってくれば、地名とするというのでいけると思います。googlemap上に存在するものであれば、何でも結果を返してくれると記憶しています。その代わり、本当は名前なのに地名と同じだと誤判断される可能性があります。
いったん、これで機械的に処理したのちに人手でチェックという感じでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

あなたのいう「都市名」というのをリストにしといて、それと比較して都市名かどうかを判定する、というテでしょうね

#都市名をリストで用意できるかどうかというのはべつのはなし

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7513questions

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

  • Python 3.x

    5924questions

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

  • Geolocation

    25questions

    Geolocation(ジオロケーション)は、携帯電話やインターネットに接続したコンピューターターミナルなど、オブジェクトの現実世界での地理的位置の情報を扱う技術であり、位置評価の実施や、実際に評価された位置を示す場合もあります。