pandas_DataFrameの作成 & append & to_list & set_index #351
DataFrameはデータ分析をする上で避けて通れないものですが、扱いに少々クセがあります。
dataオプションに辞書型でデータを渡すとDataFrameとして定義できます。辞書のkeyがカラムに、リスト形式のvalueが各レコードになっています(左端の0, 1, 2はindexです)。
import pandas as pd
zzzz = pd.DataFrame(data={'a': [1, 1, 1], 'b': [2, 2, 2], 'c': [3, 3, 3]})
---
a b c
0 1 2 3
1 1 2 3
2 1 2 3
レコード数(配列の長さ)が一致していれば、辞書型で各レコードに格納することもできます。
import pandas as pd
yyyy = pd.DataFrame(data={'a': [1, 1, 1], 'b': [2, 2, 2], 'c': [3, 3, 3], 'd': [{'zz': [4, 4, 4]}, {'yy': [5, 5, 5]}, {'xx': [6, 6, 6]}]})
---
a b c d
0 1 2 3 {'zz': [4, 4, 4]}
1 1 2 3 {'yy': [5, 5, 5]}
2 1 2 3 {'xx': [6, 6, 6]}
レコード数がバラバラだとエラーになります。'a'の値を1つ少なくしてみます。
import pandas as pd
yyyy = pd.DataFrame(data={'a': [1, 1], 'b': [2, 2, 2], 'c': [3, 3, 3], 'd': [{'zz': [4, 4, 4]}, {'yy': [5, 5, 5]}, {'xx': [6, 6, 6]}]})
---
ValueError: arrays must all be same length
リストそのものを値として格納することもできます。1つ目のレコードに格納するイメージで、リストの中にリストを記述します。
import pandas as pd
xxxx = pd.DataFrame(data={'a': [[1, 1, 1]], 'b': [[2, 2, 2]], 'c': [[3, 3, 3]], 'd': [{'zz': [4, 4, 4], 'yy': [5, 5, 5]}]})
---
a b c d
0 [1, 1, 1] [2, 2, 2] [3, 3, 3] {'zz': [4, 4, 4], 'yy': [5, 5, 5]}
データフレームは一度初期化されると、再代入などをしないと値が更新されません。
zzzz = pd.DataFrame(data={'a': [1, 1, 1], 'b': [2, 2, 2], 'c': [3, 3, 3]})
print(zzzz)
---
a b c
0 1 2 3
1 1 2 3
2 1 2 3
# zzzz自体は更新されていない
zzzz.append({'a': [99, 99, 99], 'b': [88, 88, 88], 'c': [77, 77, 77]}, ignore_index=True)
print(zzzz)
---
a b c
0 1 2 3
1 1 2 3
2 1 2 3
# 再代入することで更新したデータフレームを扱えるようになる。
zzzz_2 = zzzz.append({'a': [99, 99, 99], 'b': [88, 88, 88], 'c': [77, 77, 77]}, ignore_index=True)
print(zzzz_2)
---
a b c
0 1 2 3
1 1 2 3
2 1 2 3
3 [99, 99, 99] [88, 88, 88] [77, 77, 77]
おや、初期化時と同じように記述しましたが、値の保存方法が異なるようです。appendは1レコードずつ保存するのが簡単です。
zzzz_2 = zzzz.append({'a': 99, 'b': 88, 'c': 77}, ignore_index=True)
---
a b c
0 1 2 3
1 1 2 3
2 1 2 3
3 99 88 77
ちなみにappendする際はignore_index=Trueとしないと動きません。これは追加したレコードに新たなindexを割り振るためのオプションです。
↓ignore_index=Trueにしなかった場合のエラー
TypeError: Can only append a dict if ignore_index=True
DataFrameでは特定のカラムをリストに変換することも可能です。
zzzz_list = zzzz['c'].to_list()
---
[3, 3, 3]
特定のカラムをindexに変換可能です。drop=Falseだと元のカラムを残したまま新たなindexが作られます。一段下がっているところがindexです。
zzzz_index = zzzz.set_index(['a', 'b'], drop=False)
---
a b c
a b
1 2 1 2 3
2 1 2 3
2 1 2 3
drop=Trueならindexに使ったカラムが消えます。
zzzz_index = zzzz.set_index(['a', 'b'], drop=True)
---
c
a b
1 2 3
2 3
2 3
inplace=Trueとすれば、元のデータフレームを更新することができます。
zzzz = pd.DataFrame(data={'a': [1, 1, 1], 'b': [2, 2, 2], 'c': [3, 3, 3]})
zzzz.set_index(['a', 'b'], drop=False, inplace=True)
print(zzzz)
---
a b c
a b
1 2 1 2 3
2 1 2 3
2 1 2 3
これまでガンとして変わらなかった元のデータフレームが更新されました。
ここまでお読みいただきありがとうございました!
この記事が気に入ったらサポートをしてみませんか?