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に関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!















