pandas
では、リストからデータフレームを生成することもできます。
しかし、pandas
の操作に慣れていないうちは、ちょっとした操作も難しいですよね。
例えば、次のようなことで悩んでしまうことも:
- リストから
DataFrame
を作るにはどうすればいいの? - インデックス名やコラム名が設定できない!
そこで、この記事では次の内容をサンプルコード付きで解説していきます。
- リストからデータフレームを生成、行と列を追加する方法
- インデックス名、コラム名を設定する方法
DataFrame
を転値する方法(行と列が期待と逆だった時の対応)
DataFrame
生成のパターンをマスターして、自由にDataFrame
を作れるようになりましょう!
- リストからDataFrame生成|pd.DataFrame()
- インデックス名、カラム名の設定方法
- リストから行と列を追加する方法
- DataFrameの行列を入替(転値)|df.T
- おわりに|padans関連おススメ追加コンテンツ
リストから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 |
True :df そのものを上書き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】
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!