見出し画像

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

これまでガンとして変わらなかった元のデータフレームが更新されました。


ここまでお読みいただきありがとうございました!

この記事が気に入ったらサポートをしてみませんか?