4-2. pandas(DataFrame)-データ入出力
1. CSVファイル入出力
※ファイル名=dataframe_csv_test.csv
Data(dataframe_csv_test.csv)
key,val,col1,col2
1,TESTa,テスト1,テスト01
2,TESTb,テスト2,テスト02
3,TESTc,テスト3,テスト03
CSVファイル読込み(UTF-8(標準))
df = pd.read_csv('dataframe_csv_test.csv', encoding='utf-8')
key val col1 col2
0 1 TESTa テスト1 テスト01
1 2 TESTb テスト2 テスト02
2 3 TESTc テスト3 テスト03
文字コードがShiftJIS(CP932)の場合
df = pd.read_csv('dataframe_csv_test.csv', encoding='cp932')
==> UnicodeDecodeError: 'cp932' codec can't decode byte 0x86 in position 2: illegal multibyte sequence
※UTF-8マルチバイトを含むファイルを読込むと、上記エラーとなる。
df = pd.read_csv('dataframe_csv_test_cp932.csv', encoding='cp932')
==> key val col1 col2
==> 0 1 TESTa テスト1 テスト01
==> 1 2 TESTb テスト2 テスト02
==> 2 3 TESTc テスト3 テスト03
ヘッダ行を列名扱いしない場合
df = pd.read_csv('dataframe_csv_test.csv', header=None)
==> 0 key val col1 col2
==> 1 1 TESTa テスト1 テスト01
==> 2 2 TESTb テスト2 テスト02
==> 3 3 TESTc テスト3 テスト03
※列名もデータ扱いされる。
ヘッダを読み飛ばしたいとき
df = pd.read_csv('dataframe_csv_test.csv', header=None, skiprows=1)
==> 0 1 2 3
==> 0 1 TESTa テスト1 テスト01
==> 1 2 TESTb テスト2 テスト02
==> 2 3 TESTc テスト3 テスト03
※ 列名は連番になる。
※ データの1行目に列名が入っているので、skiprows=1を入れないと列名がデータとして読込まれる
※ pd.read_csv('dataframe_csv_test.csv', header=None, skiprows=[0]) でも同じ
skiprowsのリスト指定は、INDEX番号で任意の行をスキップできる
先頭の2行のみ読込む場合
df = pd.read_csv('dataframe_csv_test.csv', nrows=2)
==> key val col1 col2
==> 0 1 TESTa テスト1 テスト01
==> 1 2 TESTb テスト2 テスト02
CSVファイル出力
df = pd.read_csv('dataframe_csv_test.csv', encoding='utf-8')
df.to_csv('dataframe_out_test.csv')
出力結果(dataframe_out_test.csv)
,key,val,col1,col2
0,1,TESTa,テスト1,テスト01
1,2,TESTb,テスト2,テスト02
2,3,TESTc,テスト3,テスト03
2. Excelファイル読込み
read_excelで"xlsx"フォーマット読み込むためには、pandas1.1以上で、openpyxlモジュールが必要。 下記実行しておくこと。xlrdも必要(データの内容次第ではxlsxの読込に失敗する場合あり)。 明示的にopenpyxlを使用する場合は「engine='openpyxl'」を指定
「dataframe_xls_test.xlsx」は下記内容のExcelデータ。 <画像>
pip install pandas
pip install xlrd
pip install openpyxl
df = pd.read_excel('dataframe_xls_test.xlsx', sheet_name='dataframe_test', engine='openpyxl')
==> key val col1 col2
==> 0 10 TESTA テスト1 テスト10
==> 1 20 TESTB テスト2 テスト20
==> 2 30 TESTC テスト3 テスト30
df.to_excel('dataframe_xls_out_test.xlsx', sheet_name='sheetXX', engine='openpyxl')
3. HTMLファイルの読込み
基本的なデータの読込み
HTML中のTABLEタグの内容を取得する。 結果はリストとして戻される。 1つの表が、1つのリスト要素として保持される。 リスト要素はDataFrame型。
「dataframe_html_test.html」は下記内容のHTMLデータ。 <HTMLリンク>
df = pd.read_html('dataframe_html_test.html', encoding='utf-8') # utf-8
==> >>> df
==> [ 0 1 2
==> 0 key val col1
==> 1 10 TEST-A テスト100
==> 2 20 TEST-B テスト200
==> 3 30 TEST-C テスト300, tab2key tab2val
==> 0 10 テストAAA
==> 1 90 テストBBB]
その中の一要素としてDataFrameが含まれている形となる
==> >>> print(type(df))
==> <class 'list'>
==> >>> print(type(df[0]))
==> <class 'pandas.core.frame.DataFrame'>
表データの参照
1つの表だけを参照するには、リストの要素を指定する。 また、デフォルトではヘッダ(theadタグ)の内容が列名に設定される。
==> >>> df[1]
==> tab2key tab2val
==> 0 10 テストAAA
==> 1 90 テストBBB
ヘッダ行を指定すると、その行がヘッダ扱いされる。
df = pd.read_html('dataframe_html_test.html', header=0)
==> >>> df[0]
==> key val col1
==> 0 10 TEST-A テスト100
==> 1 20 TEST-B テスト200
==> 2 30 TEST-C テスト300
データ中の特定の列の値をindexにしたい場合は、index_colで指定する。 (tab2key列がindex列となる)
df = pd.read_html('dataframe_html_test.html', encoding='utf-8', index_col=0)
==> >>> df[1]
==> tab2val
==> tab2key
==> 10 テストAAA
==> 90 テストBBB
特定の行をスキップしたい場合は、skiprowsを使用する (下記の例ではヘッダ行が読み飛ばされ、[10,テストAAA]列がヘッダになっている)
df = pd.read_html('dataframe_html_test.html', encoding='utf-8', skiprows=1)
==> >>> df[1]
==> 10 テストAAA
==> 0 90 テストBBB
特定の文字列を含む表のみを取得したい場合、matchが使用できる。
df = pd.read_html('dataframe_html_test.html', match='AAA')
==> >>> df
==> [ tab2key tab2val
==> 0 10 テストAAA
==> 1 90 テストBBB]
df = pd.read_html('dataframe_html_test.html', match='1')
==> >>> df
==> [ 0 1 2
==> 0 key val col1
==> 1 10 TEST-A テスト100
==> 2 20 TEST-B テスト200
==> 3 30 TEST-C テスト300]