Python Coding Reference — 4-1. pandas(DataFrame) —

pandas(DataFrame)

1. 初期化

import pandas as pd

空のDataFrameを作成

df = pd.DataFrame()
==> Empty DataFrame
==> Columns: []
==> Index: []

初期値を持ったDataFrameを作成

df = pd.DataFrame([['a', 'b', 'c'], [10,20,30]])
==>     0   1   2
==> 0   a   b   c
==> 1  10  20  30

列名と初期値を持ったDataFrameを作成

df = pd.DataFrame([['a', 10], ['b', 20], ['c', 30]], columns=['key', 'val'])
==>   key  val
==> 0   a   10
==> 1   b   20
==> 2   c   30

2. CSVファイル入出力

2-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

2-2. CSVファイル出力

df = pd.read_csv('dataframe_csv_test.csv', encoding='utf-8')
df.to_csv('dataframe_out_test.csv')

Data(dataframe_csv_test.csv)

,key,val,col1,col2
0,1,TESTa,テスト1,テスト01
1,2,TESTb,テスト2,テスト02
2,3,TESTc,テスト3,テスト03

2-3. Excelファイル読込み

df = pd.read_excel('dataframe_xls_test.xlsx', sheet_name='dataframe_test')
==>    key    val  col1     col2
==> 0   10  TESTA  テスト1  テスト10
==> 1   20  TESTB  テスト2  テスト20
==> 2   30  TESTC  テスト3  テスト30

2-4. HTMLファイルの読込み

df = pd.read_html('dataframe_html_test.html', encoding='utf-8')  # utf-8
==> [     0       1     2       3
==> 0  key     val  col1    col2
==> 1   10  TEST-A  テスト1  テスト100
==> 2   20  TEST-B  テスト2  テスト200
==> 3   30  TEST-C  テスト3  テスト300]
 
※結果はリストとして戻され、その中の一要素としてDataFrameが含まれている形となる
==> >>> print(type(df))
==> <class 'list'>
 
==> >>> print(type(df[0]))
==> <class 'pandas.core.frame.DataFrame'>

3. pandasのデータ構造

df = pd.DataFrame([['a', 10], ['b', 20], ['c', 30], ['d', 40], ['e', 50], ['f', 60]])

3-1. 列名・行名の定義

df.columns = ['key', 'val']
df.index = ['A', 'B', 'C', 'D', 'E', 'F']
df.loc['A', 'key']
 
==>   key  val
==> A   a   10
==> B   b   20
==> C   c   30
==> D   d   40
==> E   e   50
==> F   f   60

3-2. 列名・行名の変更(rename)

df = df.rename(columns={'key': 'label'})
df = df.rename(index={'A': 'A01', 'B': 'A02'})
df.rename(index={'C': 'A03', 'D': 'A04'}, inplace=True)
 
==>     label  val
==> A01     a   10
==> A02     b   20
==> A03     c   30
==> A04     d   40
==> E       e   50
==> F       f   60

3-3. 要素数、行数、列数、行/列数の取得

全要素数

>>> df.size
12

行数

>>> len(df)
6

列数

>>> len(df.columns)
2

行/列数

>>> df.shape
(6, 2)

DataFrameの情報

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, A01 to F
Data columns (total 2 columns):
label    6 non-null object
val      6 non-null int64
dtypes: int64(1), object(1)
memory usage: 96.0+ bytes
※ 諸々の情報を出力(値としては取得できない)

インデックス番号の取得(get_loc)

df.index.get_loc('A01')
==> 0
 
df.columns.get_loc('val')
==> 1

列名にプレフィックス、サフィックスを追加

※既存名の一括修正に使用?
df = df.add_prefix('X_')
==>     X_label  X_val
==> A01       a     10
==> A02       b     20
:
後略
df = df.add_suffix('_X')
==>     X_label_X  X_val_X
==> A01         a       10
==> A02         b       20
:
後略
※行名には使用できない

3-4. データ型

データ型の確認

df = pd.DataFrame([['a', 10], ['b', 20], ['c', 30], ['d', 40], ['e', 50], ['f', 60]], columns = ['key', 'val'])
df.dtypes
 
==> key    object
==> val     int64
==> dtype: object

列毎のデータ型確認

print(df['key'].dtype)
==> object
 
print(df['val'].dtype)
==> int64

データ型の変更

float64に変更

df['val'].astype('float64')
==> 0    10.0
==> 1    20.0
==> 2    30.0
==> 3    40.0
==> 4    50.0
==> 5    60.0
==> Name: val, dtype: float64

int64に戻す

df['val'].astype('int64')
==> 0    10
==> 1    20
==> 2    30
==> 3    40
==> 4    50
==> 5    60
==> Name: val, dtype: int64

小数点以下の数値で演算すると自動的にデータ型が変わる

df['val']=df['val']*1.2
==> print(df['val'].dtype)
==> float64

文字列型への変換

文字列型への変換はstrを指定する

df['val'].astype(str)
df['val']=df['val'].astype(str)+'AAA'

※ object型を指定しても、文字列型にはならない

df['val']=df['val'].astype('object')+'AAA'
==> TypeError: unsupported operand type(s) for +: 'float' and 'str'
 
print(df['val'].dtype)
==> object

2021-09-21

Posted by tfurukaw