Python – 4-2. pandas(DataFrame)入出力
pandasでのデータ入出力
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ソースは下記の通り。
<html> <head> <meta http-equiv=Content-Type content="text/html; charset=utf-8"> </head> <body> <table border=2 cellpadding=0 cellspacing=0 width=320 style='border-collapse: collapse;table-layout:fixed;width:240pt'> <!-- col width=75 span=4 style='width:60pt' --> <tr> <td style='width:40pt'>key</td> <td style='width:60pt'>val</td> <td style='width:60pt'>col1</td> </tr> <tr> <td align=right >10</td> <td>TEST-A</td> <td>テスト100</td> </tr> <tr> <td align=right >20</td> <td>TEST-B</td> <td>テスト200</td> </tr> <tr> <td align=right >30</td> <td>TEST-C</td> <td>テスト300</td> </table> <hr> <p> <table border=2 cellpadding=0 cellspacing=0 width=320 style='border-collapse: collapse;table-layout:fixed;width:240pt'> <!-- col width=75 span=4 style='width:60pt' --> <thead> <tr> <td style='width:40pt'>tab2key</td> <td style='width:60pt'>tab2val</td> </tr> </thead> <tbody> <tr> <td align=right >10</td> <td>テストAAA</td> </tr> <tr> <td align=right >90</td> <td>テストBBB</td> </tr> </tbody> </table> </body> </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]
最近のコメント