【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
よちよち歩きが気にする事ではないのかも。ギガバイト単位のデータセットとか扱うようになってから出直すか…
今度は以上です。