Skip to content

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]