【CSV】ファイルから Pandas DataFrameへ行列抽出するテンプレート

#python3

はじめに

要するに SELECTと WHERE、ついでに headと tailみたいなことができるように Google Colabで作り置き。

サンプルデータとして
東京都 新型コロナウイルス陽性患者発表詳細 - データセット - 東京都オープンデータカタログサイト

↑から
東京都_新型コロナウイルス陽性患者発表詳細(全期間一括版)
130001_tokyo_covid19_patients.csv
の先頭23行を抜き出したものを Google Driveに置いたとする。

sample.csv↓

No,全国地方公共団体コード,都道府県名,市区町村名,公表_年月日,発症_年月日,確定_年月日,患者_居住地,患者_年代,患者_性別,患者_職業,患者_状態,患者_症状,患者_渡航歴の有無フラグ,患者_接触歴の有無フラグ,備考,退院済フラグ
1,130001,東京都,,2020-01-24,,,湖北省武漢市,40代,男性,,,,,,,1
2,130001,東京都,,2020-01-25,,,湖北省武漢市,30代,女性,,,,,,,1
3,130001,東京都,,2020-01-30,,,湖南省長沙市,30代,女性,,,,,,,1
4,130001,東京都,,2020-02-13,,,都内,70代,男性,,,,,,,1
5,130001,東京都,,2020-02-14,,,都内,50代,女性,,,,,,,1
6,130001,東京都,,2020-02-14,,,都内,70代,男性,,,,,,,1
7,130001,東京都,,2020-02-15,,,都内,80代,男性,,,,,,,1
8,130001,東京都,,2020-02-15,,,都内,50代,女性,,,,,,,1
9,130001,東京都,,2020-02-15,,,都内,50代,男性,,,,,,,1
10,130001,東京都,,2020-02-15,,,都内,70代,男性,,,,,,,1
11,130001,東京都,,2020-02-15,,,都内,70代,男性,,,,,,,1
12,130001,東京都,,2020-02-15,,,都内,40代,男性,,,,,,,1
13,130001,東京都,,2020-02-15,,,都内,60代,女性,,,,,,,1
14,130001,東京都,,2020-02-15,,,都内,40代,男性,,,,,,,1
15,130001,東京都,,2020-02-16,,,都内,60代,男性,,,,,,,1
16,130001,東京都,,2020-02-16,,,都内,30代,男性,,,,,,,1
17,130001,東京都,,2020-02-16,,,都内,60代,男性,,,,,,,1
18,130001,東京都,,2020-02-16,,,都外,60代,男性,,,,,,,1
19,130001,東京都,,2020-02-16,,,都内,30代,男性,,,,,,,1
20,130001,東京都,,2020-02-18,,,都内,80代,男性,,,,,,,1
21,130001,東京都,,2020-02-18,,,都内,20代,男性,,,,,,,1
22,130001,東京都,,2020-02-18,,,都内,50代,男性,,,,,,,1

この CSVデータの第1, 3, 5, 9, 10列を選んで、第9列が「30代」である行を抽出して Pandas Data Frameにする例を元にテンプレを作る。

分かりやすく? グーグルスプレッドシートの QUERY関数の例で言うと
=QUERY(A1:Q23, " SELECT A, C, E, I, J WHERE I = '30代' ", 1)

また、AWKのワンライナーならラインマジックで↓

!awk 'BEGIN{FS=","; OFS=","} NR==1{print $1, $3, $5, $9, $10} $9~/30代/{print $1, $3, $5, $9, $10}' /content/drive/MyDrive/sample.csv

"""
↓出力
No,都道府県名,公表_年月日,患者_年代,患者_性別
2,東京都,2020-01-25,30代,女性
3,東京都,2020-01-30,30代,女性
16,東京都,2020-02-16,30代,男性
19,東京都,2020-02-16,30代,男性
"""

↑この出力と同じものをPython / Pandasで作りたいので…

Pandas DataFrame用 CSV読み書きテンプレート

        #select_and_where.

import pandas

        #初期化.
クエリ = ''
末尾行 = 0

                #パラメタ設定始め.
#"""
        #読み込み.
CSVファイルPATH = '/content/drive/MyDrive/sample.csv'
エンコード = None  #|'shift_jis'|'CP932'
列区切り = ','
#列指定 = None
列指定 = [0, 2, 4, 8, 9]
#列指定 = ['No', '都道府県名', '公表_年月日', '患者_年代', '患者_性別']
スキップ行 = 0  #行数  #行指定はリスト
ヘッダ行 = 0    #行番号  #単行
#ヘッダ行 = [0, 1, 2]    #複行
#ヘッダ行 = None
列名付加 = None
#列名付加 = ['No', '府県名', '公表年月日', '年代', '性別']
インデックス列 = None
#インデックス列 = ['No', '都道府県名', '公表_年月日']  #(一意になる)列のリスト
読み込み行数制限 = None
#読み込み行数制限 = 22  #head -n 23
型指定 = None  #|str|int|float
#型指定 = {0:str, 2:str}  #読み込み後の列番/列名で
日付型指定 = None
#日付型指定 = [2]    #読み込み後の列番/列名で
欠損値処理 = True  #あるいは False
#"""
        #書き出し.
出力先 = '/content/drive/MyDrive/outfile.csv'
出力列区切り = ','
出力インデックス = None  #あるいは True

        #行検索クエリ.
クエリ = '患者_年代.str.match(r"30代")'  #"正規表現"は/^正規表現/
#クエリ = '患者_年代.str.contains(r"30代")'  #正規表現
#クエリ = '患者_年代 == "30代"' #完全一致
#クエリ = '患者_年代 == "30代" & 公表_年月日.str.match(r"2020-02")'
#クエリ = '列名.str.contains(r"(?i)python")'  #正規表現(大文字小文字区別せず)
#クエリ = '列名.str.contains(r"python", case=False)'  #正規表現(大文字小文字区別せず)
#クエリ = '3 <= index <= 5'  #行範囲(ヘッダを除いて 0から)
#クエリ = '"2020-01-01" <= 公表_年月日 < "2020-02-01"'

        #TAIL.
#末尾行 = 5  #整数のみ
                #パラメタ設定終わり.
#"""
        #データフレーム作成.
imported_df = pandas.read_csv(
    CSVファイルPATH,
    encoding = エンコード,
    sep = 列区切り,
    usecols = 列指定,
    skiprows = スキップ行,
    header = ヘッダ行,
    names = 列名付加,
    index_col = インデックス列,
    nrows = 読み込み行数制限,
    dtype = 型指定,
    parse_dates = 日付型指定,
    na_filter = 欠損値処理)
#"""
        #抽出.
selected_df = (
    imported_df.query(クエリ, engine='python') if クエリ else
    imported_df)
tailed_df = (
    selected_df.tail(末尾行) if 末尾行 else
    selected_df)

        #出力.
#print(tailed_df)
display(tailed_df)
tailed_df.to_csv(
    出力先,
    sep=出力列区切り,
    index=出力インデックス)

この print結果は以下のとおり↓

    No 都道府県名      公表_年月日 患者_年代 患者_性別
1    2   東京都  2020-01-25   30代    女性
2    3   東京都  2020-01-30   30代    女性
15  16   東京都  2020-02-16   30代    男性
18  19   東京都  2020-02-16   30代    男性

うん、AWKと(ファイルのほうは)同じ。

なお、いちどデータフレームを作成すれば
"""~#読み込み~"""

"""~#データフレーム作成~"""
を省いてもオブジェクト「imported_df」への操作ができます(特に元CSVが巨大な場合は推奨)。

(おしまい)

Google Colaboratory↓



この記事が気に入ったらサポートをしてみませんか?