よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【Pandas】DataFrameオブジェクトをそのままリストに放り込める、ですと?

DataFrameオブジェクトをそのままリストに放り込む

そんなことできるなんて、今さら知りまして。やってみましょ。

この投稿は、前回の課題のつづきとします。

import numpy as np
import pandas as pd
# 適当にデータフレームを生成
data1 = np.arange(1,11).reshape(5,2)
col1 = 'A B'.split()
idx1 = 'あ い う え お'.split()


df1 = pd.DataFrame(data1,
                   columns=col1,
                   index=idx1)

df1
                   
A B
1 2
3 4
5 6
7 8
9 10
# 適当にデータフレームを生成
data2 = np.random.randint(1,101,(3,4))
col2 = 'one two three four'.split()
idx2 = np.arange(1,4)

df2 = pd.DataFrame(data2,
                   index=idx2,
                   columns=col2)

df2
one two three four
1 41 39 15 32
2 42 12 80 3
3 96 68 44 44

リストに上の2つのデータフレームをそのまま入れてみる。

# データフレームをそのままリストへ
lst =  [df1, df2]

lst
[   A   B
 あ  1   2
 い  3   4
 う  5   6
 え  7   8
 お  9  10,
    one  two  three  four
 1   41   39     15    32
 2   42   12     80     3
 3   96   68     44    44]
# リストの0番目抽出
lst[0]
A B
1 2
3 4
5 6
7 8
9 10

で、できる・・・

新たなデータフレームをリストに追加してみる。

# 適当にデータフレームを生成
data3 = np.random.randn(6,4)
col3 = "① ② ③ ④".split()
idx3 = "Υ Χ Ψ β ζ λ".split()
df3 = pd.DataFrame(data3,
                  columns=col3,
                  index=idx3)

# リストに追加
lst.append(df3)

# リストを表示
lst
[   A   B
 あ  1   2
 い  3   4
 う  5   6
 え  7   8
 お  9  10,
    one  two  three  four
 1   41   39     15    32
 2   42   12     80     3
 3   96   68     44    44,
           0         1         2         3
 0 -0.400726  0.997227 -0.274173 -0.103285
 1  0.563443 -0.588548 -0.346923  0.500347
 2 -0.193223 -0.559167 -1.109381  2.336144
 3 -2.359026  1.657640 -1.622615  0.469117
 4  0.087498 -0.249747  0.826759  1.594412
 5  0.032959 -0.679530 -1.537743  0.505214,
           ①         ②         ③         ④
 Υ -0.862757  0.475249 -1.622999 -0.716250
 Χ -1.155025  0.641751  1.611223  0.728531
 Ψ -1.316703  0.726489  0.973834 -1.861403
 β  0.017306  2.331076  0.169024 -0.430141
 ζ  1.709381 -0.770732 -1.169853  1.123146
 λ  0.638893 -0.667548 -0.088138  0.410923,
           ①         ②         ③         ④
 Υ -0.084260 -0.708409  0.606739 -0.423014
 Χ  1.049596  0.059431 -1.459993 -0.691876
 Ψ  0.646630 -2.615035 -0.715016 -0.115911
 β -1.489444 -0.280290 -2.169928 -0.059322
 ζ -0.239126  1.779861 -0.607539  1.566514
 λ -0.484952 -0.638903  1.836684 -0.007052]

できる子。



今度は辞書にしてみる。

num = np.arange(4)
df_lst = lst

# 辞書化
d = dict(zip(num, df_lst))

d
{0:    A   B
 あ  1   2
 い  3   4
 う  5   6
 え  7   8
 お  9  10,
 1:    one  two  three  four
 1   41   39     15    32
 2   42   12     80     3
 3   96   68     44    44,
 2:           0         1         2         3
 0 -0.400726  0.997227 -0.274173 -0.103285
 1  0.563443 -0.588548 -0.346923  0.500347
 2 -0.193223 -0.559167 -1.109381  2.336144
 3 -2.359026  1.657640 -1.622615  0.469117
 4  0.087498 -0.249747  0.826759  1.594412
 5  0.032959 -0.679530 -1.537743  0.505214,
 3:           ①         ②         ③         ④
 Υ -0.862757  0.475249 -1.622999 -0.716250
 Χ -1.155025  0.641751  1.611223  0.728531
 Ψ -1.316703  0.726489  0.973834 -1.861403
 β  0.017306  2.331076  0.169024 -0.430141
 ζ  1.709381 -0.770732 -1.169853  1.123146
 λ  0.638893 -0.667548 -0.088138  0.410923}
# 辞書からキー指定でvalueを抽出
d[3]
Υ -0.862757 0.475249 -1.622999 -0.716250
Χ -1.155025 0.641751 1.611223 0.728531
Ψ -1.316703 0.726489 0.973834 -1.861403
β 0.017306 2.331076 0.169024 -0.430141
ζ 1.709381 -0.770732 -1.169853 1.123146
λ 0.638893 -0.667548 -0.088138 0.410923

前回投稿終わりの「連続的に生成されるデータフレームをどうやって保存するか」の課題をクリアした。

ただし、リスト型の変数にデータフレームをドンドン入れていって、メモリ的に大丈夫なのか? というPython初心者向けの本にはほとんど触れられていない問題が出てくるんだろうと思う。

うえの例のような小さなデータフレームを少数だけリスト化して変数で蓄えるぐらいなら問題にならないだろうけど、サイズが大きいデータを大量にリストに入れるのは…。

リストをpickleにて保存

pickleを使えばデータの形式がドウチャラコウチャラは気にしなくて良い的な事を噂で耳にしまして。
データフレームのオブジェクトが入ったリストをpickleでファイルに保存してみる。
モードがwbになってます。バイナリ形式なり。

# pickleにリストを保存

import pickle

with open('list.pkl', 'wb') as f:
    list_row = df_lst
    pickle.dump(list_row,f )
    
%ls | grep list.pkl
list.pkl

list.pklというファイル名で保存した、できた。



次は、保存したものを読み込む。

# pickleファイルを読み込む
with open("./list.pkl","rb") as f:
    pickled_lst = pickle.load(f)

# 出力
pickled_lst
[   A   B
 あ  1   2
 い  3   4
 う  5   6
 え  7   8
 お  9  10,
    one  two  three  four
 1   41   39     15    32
 2   42   12     80     3
 3   96   68     44    44,
           0         1         2         3
 0 -0.400726  0.997227 -0.274173 -0.103285
 1  0.563443 -0.588548 -0.346923  0.500347
 2 -0.193223 -0.559167 -1.109381  2.336144
 3 -2.359026  1.657640 -1.622615  0.469117
 4  0.087498 -0.249747  0.826759  1.594412
 5  0.032959 -0.679530 -1.537743  0.505214,
           ①         ②         ③         ④
 Υ -0.862757  0.475249 -1.622999 -0.716250
 Χ -1.155025  0.641751  1.611223  0.728531
 Ψ -1.316703  0.726489  0.973834 -1.861403
 β  0.017306  2.331076  0.169024 -0.430141
 ζ  1.709381 -0.770732 -1.169853  1.123146
 λ  0.638893 -0.667548 -0.088138  0.410923,
           ①         ②         ③         ④
 Υ -0.084260 -0.708409  0.606739 -0.423014
 Χ  1.049596  0.059431 -1.459993 -0.691876
 Ψ  0.646630 -2.615035 -0.715016 -0.115911
 β -1.489444 -0.280290 -2.169928 -0.059322
 ζ -0.239126  1.779861 -0.607539  1.566514
 λ -0.484952 -0.638903  1.836684 -0.007052]

驚くほどの簡単さ。

連続的に生成されるデータフレームを次々とリストに追加していき、リストが適度なメモリサイズになればファイルに書き出すような処理にすればよかんべか。
するってぇと、メモリのサイズを量らねばなるめぇ。



変数のメモリサイズを量る

標準ライブラリのsysを使う。sys.getsizeof(変数)で バイト数で取得される。

# 変数のメモリサイズを取得
import sys

sys.getsizeof(pickled_lst)
120

よちよち歩きが気にする事ではないのかも。ギガバイト単位のデータセットとか扱うようになってから出直すか…



今度は以上です。