

Pythonの関数にかんする質問です。文字列を抽出するプログラムを作成しています。  
そのなかでPythonの関数の基本を押さえていなかったため、躓いてしまいました。

環境  
Python3.5.2

[code]

    import re
    
    list1 = [
        '5/1:hogehoge町:hogehoge大会',
        '5/2:hogehoge町:hogehoge大会',
        '5/3:hogehoge町:hogehoge大会',
        '5/4:hogehoge町:hogehoge大会',
        '5/5:hogehoge町:hogehoge大会',
        ]
    
    def get_content(self,list1):
        for content in list1:
            pass
    
    def parse_content():
        pass
    
[/code]

list1に格納されているのは架空のイベントのリストです。  
get_content関数でリストから要素を1つずつ取得し、取得した要素はparse_content関数で正規表現などを使って解析したいです。  
正規表現は一通りできるのですが、Pythonの関数について基本を抑えていなかったようで、うまくプログラムを製作できません。  
理想通りに動かすにはどうすればいいのかご教授おねがいします。


CC BY-SA 3.0
2018-04-24T04:15:45.517
43508
2018-04-25T13:53:11.247
2018-04-24T04:26:47.393
3060
27527
question
python python3
Pythonの関数に関する質問


要素を取り出すだけであれば、コメントにあるように組み込み関数のsplitとreplaceでできます。

[code]

    list1 = [
        '5/1:hogehoge町:hogehoge大会',
        '5/2:hogehoge町:hogehoge大会',
        '5/3:hogehoge町:hogehoge大会',
        '5/4:hogehoge町:hogehoge大会',
        '5/5:hogehoge町:hogehoge大会',
        ]
    
    
    
    def get_content(l):
        # 出力リストを初期化する
        li = list()
    
        for contest in l:
            # 「:」で分割
            date, city, name = contest.split(':')
    
            # 月と日を分割
            month, day = date.split('/')
    
            # 町名、大会名から「町」「大会」の文字を抜く
            city_sur = city.replace('町', '')
            name_sur = name.replace('大会', '')
    
            # 出力リストに要素を追加する
            li.append([month, day, city_sur, name_sur])
    
        return li
    
    
    get_content(list1)
    # =>
    # [['5', '1', 'hogehoge', 'hogehoge'],
    #  ['5', '2', 'hogehoge', 'hogehoge'],
    #  ['5', '3', 'hogehoge', 'hogehoge'],
    #  ['5', '4', 'hogehoge', 'hogehoge'],
    #  ['5', '5', 'hogehoge', 'hogehoge']]
    
[/code]

あとはリストの中身を解析すれば良いので、例えば開催町を集計するなどはcollections.Counterを使うと便利です。

[code]

    from collections import Counter
    
    parsed_list = get_content(list1)
    
    # 入れ子のリストからインデックス2個目の要素のみを抽出
    cities = [i[2] for i in parsed_list]  
    # =>
    # ['hogehoge', 'hogehoge', 'hogehoge', 'hogehoge', 'hogehoge']
    
    Counter(cities)
    # =>
    # Counter({'hogehoge': 5})
    
[/code]


CC BY-SA 3.0
2018-04-24T23:55:55.583
43535
2018-04-24T23:55:55.583
26558
43508
answer


データの解析をしたい場合は、データサイエンティストが使っているPandas, NumPyを使うと便利です。

[code]

    import pandas as pd
    import numpy as np
    import re
    
    list1 = [
    '5/1:hogehoge町:hogehoge大会',
    '5/2:hogehoge町:hogehoge大会',
    '5/3:hogehoge町:hogehoge大会',
    '5/4:hogehoge町:hogehoge大会',
    '5/5:hogehoge町:hogehoge大会',
    ]
    
    # データの読み込み及び「:」で分割
    df = pd.Series(list1).str.split(':', expand=True)
    # 日付をdatetime型に変換
    df['日付'] = pd.to_datetime('2018/' + df[0])
    # 正規表現を使って市町を除く
    regex_pat = re.compile(r'市|町$')
    df['市町村'] = df[1].str.replace(regex_pat, '')
    # 普通にreplaceを使えます
    df['大会'] = df[2].str.replace('大会', '')
    
[/code]

これでデータの準備ができました。

[code]

    df   
        0   1           2           日付          市町村     大会
    0   5/1 hogehoge町   hogehoge大会  2018-05-01  hogehoge    hogehoge
    1   5/2 hogehoge町   hogehoge大会  2018-05-02  hogehoge    hogehoge
    2   5/3 hogehoge町   hogehoge大会  2018-05-03  hogehoge    hogehoge
    3   5/4 hogehoge町   hogehoge大会  2018-05-04  hogehoge    hogehoge
    4   5/5 hogehoge町   hogehoge大会  2018-05-05  hogehoge    hogehoge
    
[/code]

Pandas, NumPyには、データ解析のための便利な機能を持っています。  
日付、市町村、大会のカラムを取り出したい場合は、

[code]

    df[['日付', '市町村', '大会']]
    
[/code]

市町村別の件数を知りたい場合は

[code]

    df['市町村'].value_counts()
    
[/code]

データをExcelファイルに書き出したいときは

[code]

    df.to_excel('data.xlsx')
    
[/code]

Pandasはベクトル演算ができるのでループがなくなってストレートにプログラムが書けます。

また、Jupyter Notebookを使うと実行結果を記録しながら解析作業を進められます。  
Google Colaboratoryの方にも同じものアップしておきます。Google Colaboratoryは、無料でGoogle
IDがあればJupyter Notebookを使えます。

<https://colab.research.google.com/drive/16yKmNo3Z13rbkH_w2f6Gcd0TvME3ykpg>


CC BY-SA 3.0
2018-04-25T13:53:11.247
43551
2018-04-25T13:53:11.247
15171
43508
answer