pythonでのデータ処理 覚書

1. 初めに


2. CSV,Excelをpandasに読み込み


3. pandasからCSV,Excelに書き込み


4. pandasのデータ構造

4.1. DataFrame

4.2. Series

4.3. Data型

データ型
dtype
型コード 説明
int8 i1 符号あり8ビット整数型
int16 i2 符号あり16ビット整数型
int32 i4 符号あり32ビット整数型
int64 i8 符号あり64ビット整数型
uint8 u1 符号なし8ビット整数型
uint16 u2 符号なし16ビット整数型
uint32 u4 符号なし32ビット整数型
uint64 u8 符号なし64ビット整数型
float16 f2 半精度浮動小数点型(符号部1ビット、指数部5ビット、仮数部10ビット)
float32 f4 単精度浮動小数点型(符号部1ビット、指数部8ビット、仮数部23ビット)
float64 f8 倍精度浮動小数点型(符号部1ビット、指数部11ビット、仮数部52ビット)
float128 f16 四倍精度浮動小数点型(符号部1ビット、指数部15ビット、仮数部112ビット)
complex64 c8 複素数(実部・虚部がそれぞれfloat32)
complex128 c16 複素数(実部・虚部がそれぞれfloat64)
complex256 c32 複素数(実部・虚部がそれぞれfloat128)
bool ? ブール型(True or False)
object O Pythonオブジェクト型

データ型名の末尾の数字はbitで表し、型コード末尾の数字はbyteで表す。同じ型でも値が違うので注意。
bool型の型コード?は不明という意味ではなく文字通り?が割り当てられている。


5. データ参照(選択)

    import pandas as pd

    s = pd.Series([1, 2, 3], index = ['i1', 'i2', 'i3'])

    d = pd.DataFrame({'c1': [11, 21, 31],
                    'c2': [12, 22, 32],
                    'c3': [13, 23, 33]},
                    index = ['i1', 'i2', 'i3'])

6. データ更新


7. 行・列の追加

方法 内容
d['D']=0 'D'は無いので、column="D"を追加し、0を入れる
d['D']=[4,7] 'D'は無いので、column="D"を追加し、リストの値を入れる
要素数は同じでないといけない
d['D'] = d['b']+1 series d['b]に+1したものをcolumn"D"として追加
indexが一致しないとNaNになる
要素数は同じでないといけない
d.assign(a=0)
d.assign(D=[9,10])
d.assign(a=1,D=0)
存在するcolumn名の場合置換え
異なる場合追加
同時に複数可能
新規オブジェクトを返す
d.insert(0, 'H', 0)
d.insert(len(d.columns), 'H', [8,9])
挿入: 引数は位置、column名,値→戻値なし
元データを置換える
位置に-1は使えない
d.append(d)
d.append(sc,ignore_index=True)
配列やSeries,dataFrameを追加する。
配列も追加できるが列名が0と成る。
新規オブジェクトを返す
列名や行名に注意、異なると追加される
SeriesのインデックスがDataFrameの列名となる
追加方向は縦(行方向)のみ
ignore_index=Trueでインデックス(行名)を無視(削除して)追加される
将来無くなる機能
pd.concat([d, d])
pd.concat([d, d],axis=1)
pd.concat([d, s], axis=1)
pd.concat([d, s], axis=1,join='inner')
結合 : 引数は、結合するデータのリスト、
結合方向 縦:axis=0 横:axis=1 デフォルトは縦、
join= [inner|outer] innerで共通するものだけ、デフォルトはouter(全部)
新規オブジェクトを返す
DataFrameとSeriesの場合、axis=0(デフォルト)ではSeriesのNameが無視される、axis=1ではNameが列名となる。
縦に項目を追加する場合、loc,iloc等の方法を使う方が良い。

8. 行・列の削除

方法 内容
del d['c'] column 'c'を削除、元データを変更、一度に1列のみ削除可能
d.drop(0)
d.drop([0,1])
d.drop(index=[...])
d.drop([0,1],axis=1)
d.drop(columns=[...])
行 または列の削除、引数はindexまたはそのリスト、行番号またはそのリスト
columns またはaxis=1で列を削除
新規オブジェクトを返す
d.pop('a') 指定列を元データから切り取って返す
行方向はできない、Tで転置したオブジェクトを作ってからpopすることはできるが行名の処理等が面倒、push()は無い
関数 オプション 内容
drop inplace=True 元データを変更する

9. その他の機能


10. データ処理 FAQ

10.1. 条件で取り出したデータを処理する場合(SettingWithCopyWarning)

10.2. 列の要素全体を処理する(map)

10.3. 必要な列の値だけを取り出して(values)、2次元配列(ndarray)にする

10.4. 2次元配列の要素から条件に一致する行を削除(np.delete)

10.5. DataFrameの行から辞書を作成する

10.6. 欠損値を埋める

10.7. DataFrameの文字列の列を結合

10.8. ある列から正規表現で取り出したデータで新しい列を作る

pickup_re = re.compile('SEAT\s*\:\s*([0-9a-fA-F]+)',flags=re.DOTALL)
df['seat'] = df['備考'].map(lambda x: pickup_re.search(x).group(1))

11. 高速化手法

11.1. マルチインデックスとタプルキー辞書

      df = pd.DataFrame([[1,2,3,4],[5,6,7,8]],columns=['a','b','c','d'])
      df = df.set_index(['a','b'])
      display(df)
      display(df.index)
      display(df.values)

          c d
      a b		
      1 2 3 4
      5 6 7 8

      MultiIndex([(1, 2),
                  (5, 6)],
                names=['a', 'b'])
      array([[3, 4],
            [7, 8]], dtype=int64)

11.1.1. DataFrameから辞書に変換 to_dict()

      dc = df.to_dict(orient='index')
      display(dc)

      {(1, 2): {'c': 3, 'd': 4}, (5, 6): {'c': 7, 'd': 8}}
      → インデックス名は消えている

11.1.2. タプルキー辞書

        if (1,2) in dc:
            pass

11.1.3. タプル辞書からDataFrameに変換 from_dict()

      dn = pd.DataFrame.from_dict(dc,orient='index')
      dn.index.rename(['a','b'],inplace=True)
      display(dn)

          c d
      a b		
      1 2 3 4
      5 6 7 8