辞書のリストから Pandas のデータフレームを作成する

Luqman Khan 2022年4月14日
辞書のリストから Pandas のデータフレームを作成する

ディクショナリは、個別の Key-Value マップを格納するコンパクトで柔軟な Python コンテナです。辞書は中括弧({})で記述されます。これには、コンマで区切られたキーワードのペアが含まれます(、)および:各キーをその値から区切ります。

ダイスゲームの例を含む 3つの辞書を以下に示します。

ダイスゲームの例を見てみましょう。この場合、2 人のプレーヤーが 6つのサイコロを振り、対応するプレーヤーと一緒にサイコロを振ります。

import pandas as pd
from numpy.random import randint
# create datset from multiple dictionaries
dataset_list=[{'Harry':1,'Josh':3,'dices':'first dice'},
              {'Harry':5,'Josh':1,'dices':'second dice'},
              {'Harry':6,'Josh':2,'dices':'third dice'},
              {'Harry':2,'Josh':3,'dices':'fourth dice'},
              {'Harry':6,'Josh':6,'dices':'fifth dice'},
              {'Harry':4,'Josh':3,'dices':'sixth dice'}]

df=pd.DataFrame(dataset_list)
print(df)
print()
harry=[]
josh=[]
for i in range(6):
    harry.append(randint(1,7))
    josh.append(randint(1,7))

データフレームがキーと値のペアをとることがわかっているため、辞書を含むアイテムのリストからデータセットを作成しました。これが辞書で適切である理由です。

出力:

   Harry  Josh        dices
0      1     3   first dice
1      5     1  second dice
2      6     2   third dice
3      2     3  fourth dice
4      6     6   fifth dice
5      4     3   sixth dice

最後の例では、サイコロを手動で設定しました。ここでは、numpy ライブラリで定義されている randint メソッドを使用します。次の行に、harryjosh という名前の 2つの空白のリストを作成しました。次に、for ループを作成しました。この範囲は 0〜6 で定義され、append() メソッドを使用して要素として 2つの定義済みリストに乱数を追加します。以下を参照してください。

import pandas as pd
from numpy.random import randint
print()
harry=[]
josh=[]
for i in range(6):
    harry.append(randint(1,7))
    josh.append(randint(1,7))
# create datset from multiple dictionaries
dataset_list=[{'Harry':harry[0],'Josh':josh[0],'dices':'first dice'},
              {'Harry':harry[1],'Josh':josh[1],'dices':'second dice'},
              {'Harry':harry[2],'Josh':josh[2],'dices':'third dice'},
              {'Harry':harry[3],'Josh':josh[3],'dices':'fourth dice'},
              {'Harry':harry[4],'Josh':josh[4],'dices':'fifth dice'},
              {'Harry':harry[5],'Josh':josh[5],'dices':'sixth dice'}]

df=pd.DataFrame(dataset_list)
print(df)

randint() の範囲は、指定された 1 から n-1、またはデフォルトではゼロから n-1 であるため、1-7 の範囲を定義しました。

出力

   Harry  Josh        dices
0      4     1   first dice
1      4     2  second dice
2      3     4   third dice
3      1     1  fourth dice
4      4     5   fifth dice
5      4     4   sixth dice

ここで、for ループを使用してコード行を減らし、辞書全体をリストに追加しました。さらに、index という名前のリストにインデックスを追加すると、プレーヤーの順番に対応し、DataFrame のインデックスとして設定されます。

import pandas as pd
from numpy.random import randint
dataset_list=[]
index=[]
for i in range(1,7):
    dataset_list.append({'Harry':randint(1,7),'Josh':randint(1,7)})
    index.append('dice '+str(i))
print('\nAfter reducing the code\n')
df=pd.DataFrame(dataset_list,index=index)

print(df)

出力:

        Harry  Josh
dice 1      2     4
dice 2      2     3
dice 3      6     5
dice 4      5     2
dice 5      4     2
dice 6      1     1

すべての例:

import pandas as pd
from numpy.random import randint
# create datset from multiple dictionaries
dataset_list=[{'Harry':1,'Josh':3,'dices':'first dice'},
              {'Harry':5,'Josh':1,'dices':'second dice'},
              {'Harry':6,'Josh':2,'dices':'third dice'},
              {'Harry':2,'Josh':3,'dices':'fourth dice'},
              {'Harry':6,'Josh':6,'dices':'fifth dice'},
              {'Harry':4,'Josh':3,'dices':'sixth dice'}]

df=pd.DataFrame(dataset_list)
print(df)
print()
harry=[]
josh=[]
for i in range(6):
    harry.append(randint(1,7))
    josh.append(randint(1,7))

# create datset from multiple dictionaries
dataset_list=[{'Harry':harry[0],'Josh':josh[0],'dices':'first dice'},
              {'Harry':harry[1],'Josh':josh[1],'dices':'second dice'},
              {'Harry':harry[2],'Josh':josh[2],'dices':'third dice'},
              {'Harry':harry[3],'Josh':josh[3],'dices':'fourth dice'},
              {'Harry':harry[4],'Josh':josh[4],'dices':'fifth dice'},
              {'Harry':harry[5],'Josh':josh[5],'dices':'sixth dice'}]

df=pd.DataFrame(dataset_list)
print(df)

dataset_list=[]
index=[]
for i in range(1,7):
    dataset_list.append({'Harry':randint(1,7),'Josh':randint(1,7)})
    index.append('dice '+str(i))
print('\nAfter reducing the code\n')
df=pd.DataFrame(dataset_list,index=index)

print(df)

出力:

   Harry  Josh        dices
0      1     3   first dice
1      5     1  second dice
2      6     2   third dice
3      2     3  fourth dice
4      6     6   fifth dice
5      4     3   sixth dice

   Harry  Josh        dices
0      4     1   first dice
1      4     2  second dice
2      3     4   third dice
3      1     1  fourth dice
4      4     5   fifth dice
5      4     4   sixth dice

After reducing the code

        Harry  Josh
dice 1      2     4
dice 2      2     3
dice 3      6     5
dice 4      5     2
dice 5      4     2
dice 6      1     1