【Pandas】データフレームを新規作成[Python]

  • URLをコピーしました!
目次

データ解析支援ライブラリPandas

前回はデータ解析支援ライブラリPandasで欠損値nanを含む行や列を削除する方法を解説しました。

ここまでPandasを使って色々データを扱う方法を解説してきました。

それでだいぶPandasのデータフレームに関して理解が深まってきたことと思います。

そんなPandasのデータフレームのなかで、まだ解説していないのが、実は一番最初の段階かもしれないこと。

そう、新しくデータフレームを作るということです。

ということで今回は新しくデータフレームを作る方法を解説していきたいと思います。

まずは準備ですが、今回はとりあえずPandasをインポートするというだけです。

import pandas as pd

それでは始めていきましょう。

空のデータフレームを作成する方法

最初は全く何も入っていないデータフレームを作成してみましょう。

新規でデータフレームを作成する場合は、「データフレーム名 = pd.DataFrame()」です。

import pandas as pd

df = pd.DataFrame()

df

実行結果
_

データフレームが空なので、「_」という表示がされました。

ちなみにprint関数で作成したデータフレームを表示してみたら、こうなりました。

import pandas as pd

df = pd.DataFrame()

print(df)

実行結果
Empty DataFrame
Columns: []
Index: []

より空だということが分かりやすいですね。

空のデータフレームにデータを追加する方法

次にからのデータフレームにデータを追加してみましょう。

データフレームにデータを追加する方法は前に解説していて、行名や列名を指定して追加する方法と列を追加するassign、またSeriesとappendを使って追加する方法がありました。

列名、行名を指定して追加する方法

まずは行名、列名を指定して追加してみましょう。

import pandas as pd

df = pd.DataFrame()

df["A"] = [1, 2, 3, 4, 5]

df

実行結果

列名を指定した場合は、無事追加されました。

次に行名を指定してみましょう。

import pandas as pd

df = pd.DataFrame()

df.loc["A"] = [1, 2, 3, 4, 5]

df

実行結果
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-28-20c3812e8ddc> in <module>
      3 df = pd.DataFrame()
      4 
----> 5 df.loc["A"] = [1, 2, 3, 4, 5]
      6 
      7 df

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in __setitem__(self, key, value)
    203             key = com.apply_if_callable(key, self.obj)
    204         indexer = self._get_setitem_indexer(key)
--> 205         self._setitem_with_indexer(indexer, value)
    206 
    207     def _validate_key(self, key, axis: int):

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in _setitem_with_indexer(self, indexer, value)
    404 
    405             if missing:
--> 406                 return self._setitem_with_indexer_missing(indexer, value)
    407 
    408         # set

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py in _setitem_with_indexer_missing(self, indexer, value)
    633             if not len(self.obj.columns):
    634                 # no columns and scalar
--> 635                 raise ValueError("cannot set a frame with no defined columns")
    636 
    637             if isinstance(value, ABCSeries):

ValueError: cannot set a frame with no defined columns

行名を指定した場合はエラーとなってしまいました。

エラーとしてはカラム(列名)を指定していないということでした。

assignで列を追加する方法

次にassignで列を追加してみましょう。

import pandas as pd

df = pd.DataFrame()

test_series = pd.Series([1, 2, 3, 4, 5])

df = df.assign(A = test_series)

df

実行結果

Seriesとappendで行を追加する方法

次にSeriesとappendのコマンドを使って行を追加してみましょう。

import pandas as pd

df = pd.DataFrame()

test_series = pd.Series([1, 2, 3, 4, 5], name="A")

df = df.append(test_series)

df

実行結果

行を追加することができました。

行名、列名のみをもったデータフレームを作成する方法

次に行名、列名のみをもち、データをもっていないデータフレームを作成してみましょう。

先ほど空のデータフレームを作成する方法として「データフレーム名 = pd.DataFrame()」を紹介しました。

行名、列名をもった状態でデータフレームを作成するには、このオプションとして「index=行名のリスト」、「columns=列名のリスト」を追加します。

ということで「データフレーム名 = pd.DataFrame(index=行名のリスト, columns=列名のリスト)」となります。

試してみましょう。

import pandas as pd

df = pd.DataFrame(index=["A", "B", "C"], columns=["x", "y", "z"])

df

実行結果

行名、列名が表示され、それぞれのデータは欠損値NaNというデータフレームを作成することができました。

行名、列名、データをもったデータフレームを作成する方法

では次に行名、列名だけではなく、最初からデータももったデータフレームを作成してみましょう。

その場合は、オプションにデータのリストを追加します。

ということで先ほどの行名、列名と合わせて、「データフレーム名 = pd.DataFrame(データ, index=行名のリスト, columns=列名のリスト)」となります。

import pandas as pd

data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

df = pd.DataFrame(data, index=["A", "B", "C"], columns=["x", "y", "z"])

df

実行結果

全部入ったデータフレームが作成できました。

ちなみにデータの数が足りないと、欠損値NaNとなります。

先ほどのデータで最後の「9」を削除してみましょう。

import pandas as pd

data = [[1, 2, 3], [4, 5, 6], [7, 8]]

df = pd.DataFrame(data, index=["A", "B", "C"], columns=["x", "y", "z"])

df

実行結果

ただしデータ全てにおいて、行や列の数が合わないとエラーとなります。

例えば行の数が合わない例として、[7, 8, 9]を削除してみます。

import pandas as pd

data = [[1, 2, 3], [4, 5, 6]]

df = pd.DataFrame(data, index=["A", "B", "C"], columns=["x", "y", "z"])

df

実行結果
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in create_block_manager_from_arrays(arrays, names, axes)
   1694         blocks = form_blocks(arrays, names, axes)
-> 1695         mgr = BlockManager(blocks, axes)
   1696         mgr._consolidate_inplace()

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in __init__(self, blocks, axes, do_integrity_check)
    142         if do_integrity_check:
--> 143             self._verify_integrity()
    144 

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in _verify_integrity(self)
    344             if block._verify_integrity and block.shape[1:] != mgr_shape[1:]:
--> 345                 construction_error(tot_items, block.shape[1:], self.axes)
    346         if len(self.items) != tot_items:

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py in construction_error(tot_items, block_shape, axes, e)
   1718     raise ValueError(
-> 1719         "Shape of passed values is {0}, indices imply {1}".format(passed, implied)
   1720     )

ValueError: Shape of passed values is (2, 3), indices imply (3, 3)

(以下省略)

列の数が合わない例として、「3」「6」「9」を削除してみます。

import pandas as pd

data = [[1, 2], [4, 5],[7, 8]]

df = pd.DataFrame(data, index=["A", "B", "C"], columns=["x", "y", "z"])

df

実行結果
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/construction.py in _list_to_arrays(data, columns, coerce_float, dtype)
    499         result = _convert_object_array(
--> 500             content, columns, dtype=dtype, coerce_float=coerce_float
    501         )

/opt/anaconda3/lib/python3.7/site-packages/pandas/core/internals/construction.py in _convert_object_array(content, columns, coerce_float, dtype)
    582                 "{col:d} columns passed, passed data had "
--> 583                 "{con} columns".format(col=len(columns), con=len(content))
    584             )

AssertionError: 3 columns passed, passed data had 2 columns

(以下省略)

行名、列名を指定せず、データのみもったデータフレームを作成する方法

では行名、列名を指定せず、データのみ指定するとどうなるでしょうか。

試してみましょう。

import pandas as pd

data = [[1, 2, 3], [4, 5, 6],[7, 8, 9]]

df = pd.DataFrame(data)

df

実行結果

行名、列名は自動で「0, 1, 2」と数字が振られました。

今回はデータフレームを作成する方法を解説しました。

ただ通常データはCSVファイルのようなものから読み込むことが多いと思うので、今回のようなデータフレームの作成方法はあまり使わないかもしれません。

それでもデータフレームへの理解を深めるため、今回解説してみました。

次回はPandasからグラフを表示する方法を解説します。

ということで今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次