【CSV】ファイルから Pandas DataFrameへ行列抽出するテンプレート
はじめに
要するに 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↓
この記事が気に入ったらサポートをしてみませんか?