YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

pandas リストからDataFrameを生成|インデックスとコラムの設定も!

pandasでは、リストからデータフレームを生成することもできます。

しかし、pandasの操作に慣れていないうちは、ちょっとした操作も難しいですよね。

例えば、次のようなことで悩んでしまうことも:

  • リストからDataFrameを作るにはどうすればいいの?
  • インデックス名やコラム名が設定できない!

そこで、この記事では次の内容をサンプルコード付きで解説していきます。

  • リストからデータフレームを生成、行と列を追加する方法
  • インデックス名、コラム名を設定する方法
  • DataFrameを転値する方法(行と列が期待と逆だった時の対応)

DataFrame生成のパターンをマスターして、自由にDataFrameを作れるようになりましょう!

 

リストからDataFrame生成|pd.DataFrame()

リストからDataFrameを生成する際には、pd.DataFrame()にリストを渡します。

pd.DataFrame()の基本手な引数は次の通りです。

  • pd.DataFrame(data [,index] [,columns]) # [ ]は省略可能
引数名 説明
data Array-likeや辞書、イテラブルなど
⇒今回であればリスト
DataFrameに変換したいデータ
index Array-like
pandasのIndexクラス
インデックス名に設定するデータ
※省略すると連番の数値
columns Array-like
pandasのIndexクラス
コラム名に設定するデータ
※省略すると連番の数値

Array-likeには、NumPyのndarrayやリストなどが含まれます。

まずはインデックス名やコラム名を省略した最も簡単な例を見ていきましょう。

1次元リストからDataFrame

pd.DataFrame()[1次元のリスト]を渡すと、1列のみのDataFrameが生成されます。

import pandas as pd
data_list =[10, 11, 12]
df = pd.DataFrame( data_list )

デフォルト設定だとインデックスには、0から始まる連番が割り当てられます。

1次元のリストだと、列方向にデータが並んでいますね。

2次元リストからDataFrame

pd.DataFrame()[[2次元のリスト(リスト内リスト)]]を渡すと、リストの形状に応じた行数と列数DataFrameが生成されます。

data_list = [[10, 11],
            [100, 101],
            [1000, 1001]]
df = pd.DataFrame( data_list )

1つ1つのリスト内リストが、各行の要素になっています。

リスト内リストと同じ方向にDataFrameの要素が設定されるので視覚的にはわかりやすいですね。

下図のように行と列を逆にしたい場合は、この記事の最後で解説する転置df.TをすればOKです。

インデックス名、カラム名の設定方法

インデックス名、カラム名の設定タイミングには2つあります。

  • DataFrame作成時に設定
  • DataFrame作成後に設定

好きな方で設定すればOKです。

個人的には、DataFrame作成と同時に設定できた方が、コードがすっきりして好きです。

DataFrame作成時に設定|index, columns

pd.DataFrame()の引数で、それぞれ次の設定をします。

  • index:インデックス名
  • columns:カラム名

意識して覚えたいのが、引数名のindexは単数なのに、columnsは複数なのです。

まずはリストでインデックス名、カラム名を設定する例を紹介します。

data_list =[[10, 11],
            [100, 101],
            [1000, 1001]]
            
df = pd.DataFrame(data_list, 
                  columns=["Col0", "Col1"],
                  index=["Ind0", "Ind1", "Ind2"] )

リストを使用するとシンプルですが、インデックス名、カラム名は設定できません。

インデックス列とカラム行に名前を付けたい場合には、pd.Index()クラスを利用します。

  • index = pd.Index([インデックスのデータ], name="インデックス名")
  • columns= pd.Index([カラムのデータ], name="カラム名")
data_list =[[10, 11],
            [100, 101],
            [1000, 1001]]
 
df = pd.DataFrame(data_list,
                  columns=pd.Index(["Col0", "Col1"], name="col_name"),
                  index = pd.Index(["Ind0", "Ind1", "Ind2"], name="ind_name") )

インデックス名とカラム名は設定しなくても困りませんが、あった方が見やすいですね。

後からインデックス行指定|df.set_index()

DataFrameのメソッド.set_index()を使用するとインデックス行を指定できます。

  • df.set_index(keys [, inplace])
引数名 説明
keys 文字列 インデックスに設定する列のラベル名
inplace True or False
デフォルト:False
Truedfそのものを上書き
False:新しいdfを返す(元のdfは変化なし)

.set_index()には他にも細かい設定がありますが、ここでは基本的な使い方だけ紹介します。

data_list =[["Ind0", 10, 11],
            ["Ind1", 100, 101],
            ["Ind2", 1000, 1001]]
df = pd.DataFrame( data_list, columns=["Col_Ind", "Cal0", "Cal1"])

"Col_Ind"行をインデックス行に指定してみましょう。

df.set_index("Col_Ind", inplace = True)

.set_index()は、次のように生成時に使用してしまっても良いですね。

df = pd.DataFrame( data_list, columns=["Col_Ind", "Cal0", "Cal1"]).set_index("Col_Ind")

DataFrame生成時に設定してしまった方が、コードがすっきりした感じになります。

後からインデックス、コラム設定|df.index=[…]

インデックス、コラムを入力せずにDataFrameを作成して、後から設定することもできます。

その場合は、dfの対応するプロパティを設定します。

  • df.index = [リスト]や[pd.Index]など
  • df.columns = [リスト]や[pd.Index]など

次のシンプルなデータフレームにインデックス、コラムを後から設定してみます。

data_list =[[10, 11],
            [100, 101],
            [1000, 1001]]
df = pd.DataFrame( data_list )

インデックスやコラムを設定します。

df.columns = ["Col0", "Col1"]
df.index = ["Ind0", "Ind1", "Ind2"]

df.index.nameプロパティで、インデックス名を指定することもできます。

df.index.name = "name"

リストから行と列を追加する方法

DataFrameの操作に慣れるまでは、リストを追加するのも戸惑うことがあると思います。

とはいっても、パターンを覚えてしまえば困ることはないです。

次のDataFrameに行と列を追加してみましょう。

data_list =[["Ind0", 10, 11],
            ["Ind1", 100, 101]]
df = pd.DataFrame( data_list, columns=["Col_Ind", "Cal0", "Cal1"]).set_index("Col_Ind")

列を追加|df["列名"] = […]

とても単純で追加する列名を指定して、リストを与えるだけです。

  • df["追加する列名"] = [追加するデータ]

データ数は行数と同じである必要があるので気を付けましょう。

to_add_col = [22,202]
df["Col_add"] = to_add_col

行を追加|df.loc["行名"] = […]

列の追加と似ていますが、行の指定にはdf.loc["行名"]を使用します。

  • df.loc["追加する行名"] = [追加するデータ]

データ数は列数と同じである必要があるので気を付けましょう。

to_add_row = [3000,3001, 3002]
df.loc["Ind_add"] = to_add_row

DataFrameの行列を入替(転値)|df.T

リストからDataFrameを生成する際に、行と列を逆に設定したいという状況もあると思います。

例えば、次のようにラベル名とデータが別々のリストになっているとします。

そのままDataFrame()を作ってみるとどうなるでしょうか?

label = ["A", "B", "C"]
data1 = [10, 11, 12]
data2 = [100, 101, 102]
 
data_list_2d =[ label,
                data1,
                data2]
 
df = pd.DataFrame( data_list_2d, index =  ["label", "data1", "data2"])

行と列を逆に設定できれば、インデックスに[A, B, C]を設定できて使いやすいのに…

そういった場合は、転置することで解決します。

  • df.T # データフレームの転置(行と列の入れ替え)
df = pd.DataFrame( data_list_2d, index =  ["label", "data1", "data2"])
df.T

同時に.set_index()でインデックス行を設定してしまってもいいですね。

df = pd.DataFrame( data_list_2d, index =  ["label", "data1", "data2"])
df.T.set_index("label")

行と列を逆にしたい場合は、.Tで転置できることを覚えておきましょう!

おわりに|padans関連おススメ追加コンテンツ

今回はリストからDataFrameを生成する方法と関連情報を紹介しました。

pandasは便利すぎて操作方法がわかりにくいことがよくあります…。

結局はコツコツ学ぶのが、pandasマスターの近道ですよね!≫【ブログカテゴリー:pandas】

≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
「Pythonによるデータ分析入門」を、最初から最後まで実際に実践してみたレビューです。具体的にどのようなことができるようになったかを実例付きで紹介します!・DataFrameの生成方法・欠損値の処理方法・グラフ化の方法気になる学習時間は…?
www.yutaka-note.com/entry/2019/12/07/230219
 
≫pandas | read_excel() 図解でわかりやすく解説!
≫pandas | read_excel() 図解でわかりやすく解説!
pandasで、excelファイルを読み込むための関数read_excel()について、図解で徹底解説!①表のデータがセルA1から始まっていないときの対応方法②indexやlabelの行や列を指定する方法
www.yutaka-note.com/entry/pandas_read_excel_1
 
≫pandas | read_csv() 図解でわかりやすく解説!
≫pandas | read_csv() 図解でわかりやすく解説!
pandasでcsvファイルを読み込むための関数read_csv()について、図解で徹底解説! ①区切り文字の指定②indexやlabelの行や列を指定する方法③読み込む行・列の指定など細かい設定についての解説記事です!
www.yutaka-note.com/entry/pandas_read_csv
 
≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
Python実践データ分析100本ノックで、実際に100本終了したレビューです。pythonでのデータ分析の入門書としてかなりの良書だったと思います。・python2~3冊目に何を勉強しようか迷っている人・時間をかけずにデータ分析の基本を学びたい人・pandasへの抵抗を減らしたい人
www.yutaka-note.com/entry/nock_100
 
≫pandas|head(), tail()でデータ先頭, 末尾を抽出!
≫pandas|head(), tail()でデータ先頭, 末尾を抽出!
pandasのDataFrameやSeriesで先頭や末尾の数行をさっと確認したい場合には、head()、tail()メソッドを使用します。引数で表示する行数を指定することもできますので、その使用方法を解説していきます。
www.yutaka-note.com/entry/pandas_head_tail
 

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!