Python Pandas:辞書からDataFrameを作成する方法

DataFrameコンストラクターは、ndarray、辞書などのデータオブジェクトを受け入れます。

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

しかし、データで辞書を渡す場合、シリーズ、配列、リストなどの値フィールドにオブジェクトのようなリストを含める必要があります。

# Dictionary with list object in values
studentData = {
'name' : ['jack', 'Riti', 'Aadi'],
'age' : [34, 30, 16],
'city' : ['Sydney', 'Delhi', 'New york']
}

この種類のディクショナリでDataFrameオブジェクトを初期化すると、ディクショナリの各アイテム(キー/値のペア)は1つの列に変換されます。つまり、キーは列名になり、値フィールドのリストは列データになります。

'''
Pass dictionary in Dataframe constructor to create a new object
keys will be the column names and lists in values will be column data
'''
dfObj = pd.DataFrame(studentData)

 このようなDataFrameオブジェクトを作成し、

age      city  name
0   34    Sydney  jack
1   30     Delhi  Riti
2   16  New york  Aadi

辞書のすべてのキーは列名に変換され、各値フィールドのリストは列データに変換されます。

カスタムインデックスを使用して辞書からDataFrameを作成する

デフォルトのインデックスリストを置き換えるために、インデックスリストをDataFrameコンストラクタに渡すこともできます。

# Pass custom names of index as list during initialization
dfObj = pd.DataFrame(studentData, index=['a', 'b', 'c'])

このようなDataFrameオブジェクトを作成し、

age      city  name
a   34    Sydney  jack
b   30     Delhi  Riti
c   16  New york  Aadi

互換性のない辞書からDataFrameを作成します

DataFrameコンストラクターは、値にオブジェクトのようなリストを含むディクショナリを受け入れるため。しかし、値のリストを持たない辞書がある場合はどうなりますか

Python

studentAgeData = {
'Jack' : 12,
'Roma' : 13,
'Ritika' : 10,
'Aadi' : 11
}

このディクショナリをDataFrameコンストラクターに直接渡すと、次のエラーValueErrorがスローされます。

すべてのスカラー値を使用する場合は、インデックスを渡す必要があります

したがって、この種のディクショナリから2列のDataFrameオブジェクトを作成し、すべてのキーと値をこれらの個別の列として配置する方法は、

0   1
a    Roma  13
b    Jack  12
c    Aadi  11
d  Ritika  10

そのために、この辞書からタプル(キー/値)のリストを作成し、リストを受け入れる別のデータフレームコンストラクターに渡します。

'''
Creating dataframe by converting dict to list of items
'''
dfObj = pd.DataFrame(list(studentAgeData.items()), index=['a', 'b', 'c', 'd'])

このようなDataFrameオブジェクトを作成し、

0   1
a    Roma  13
b    Jack  12
c    Aadi  11
d  Ritika  10

辞書からDataFrameを作成し、データをスキップします

ただし、いくつかの項目をスキップして、辞書からDataFrameオブジェクトを作成します。その方法を見てみましょう、

このような辞書があるとします。

# Dictionary with list object in values
studentData = {
'name' : ['jack', 'Riti', 'Aadi'],
'age' : [34, 30, 16],
'city' : ['Sydney', 'Delhi', 'New york']
}

キー'age'のアイテムをスキップして、これからDataFrameを作成します。

# Creating Dataframe from Dictionary by Skipping 2nd Item from dict
dfObj = pd.DataFrame(studentData, columns=['name', 'city'])

columnsパラメーターのように、2つの列名のみのリストを提供しました。したがって、DataFrameには2列のみを含める必要があります。

name      city
0  jack    Sydney
1  Riti     Delhi
2  Aadi  New york

異なる方向の辞書からDataFrameを作成します

DataFrame.from_dict()関数も使用して、辞書からDataFrameを作成できます。

DataFrame.from_dict(data, orient='columns', dtype=None)

辞書とオリエンテーションも受け入れます。デフォルトの方向は列です。これは、辞書のキーがDataFrameの作成中に列として使用されることを意味します。

方向を「インデックス」として渡すこともできます。これにより、デフォルトの方向が変更され、辞書のキーがインデックスになります。つまり、

studentData = {
'name' : ['jack', 'Riti', 'Aadi'],
'age' : [34, 30, 16],
'city' : ['Sydney', 'Delhi', 'New york']
}

方向がインデックスのDataFrameを作成します。すなわち

# Create dataframe from dic and make keys, index in dataframe
dfObj = pd.DataFrame.from_dict(studentData, orient='index')

このようなDataFrameオブジェクトを作成し、

0      1         2
name    jack   Riti      Aadi
city  Sydney  Delhi  New york
age       34     30        16

ネストされた辞書からDataFrameを作成する

ネストされた辞書、つまり

# Nested Dictionary
studentData = {
0 : {
'name' : 'Aadi',
'age' : 16,
'city' : 'New york'
},
1 : {
'name' : 'Jack',
'age' : 34,
'city' : 'Sydney'
},
2 : {
'name' : 'Riti',
'age' : 30,
'city' : 'Delhi'
}
}

3つのアイテムがあり、各アイテムには値フィールドにディクショナリが含まれ、ディクショナリには同じキーが含まれていますが、値が異なります。

DataFrameコンストラクターに直接渡すことができますが、dictのキーを列として使用し、このようにDataFrameオブジェクトが生成されます。

'''
Create dataframe from nested dictionary
'''
dfObj = pd.DataFrame(studentData)

このようなDataFrameオブジェクトを作成し、

0       1      2
age         16      34     30
city  New york  Sydney  Delhi
name      Aadi    Jack   Riti

次に、この行列を転置して、列をインデックスと交換します。つまり、データはこれでより読みやすくなります。

# Transpose dataframe object
dfObj = dfObj.transpose()

これで、DataFrameのコンテンツは次のようになります。

age      city  name
0  16  New york  Aadi
1  34    Sydney  Jack
2  30     Delhi  Riti

完全な例は次のとおりです。

import pandas as pd
def main():
    
    # Dictionary with list object in values
    studentData = {
        'name' : ['jack', 'Riti', 'Aadi'],
        'age' : [34, 30, 16],
        'city' : ['Sydney', 'Delhi', 'New york']
    }
    
    print('Creating Dataframe from Dictionary')
    
    '''
    Pass dictionary in Dataframe constructor to create a new object
    keys will be the column names and lists in values will be column data
    '''
    dfObj = pd.DataFrame(studentData)
    # Print data frame object on console
    print(dfObj)
    
    print('Creating Dataframe from Dictionary and Custom Indexes')
    
    # Pass custom names of index as list during initialization
    dfObj = pd.DataFrame(studentData, index=['a', 'b', 'c'])
    
    # Print dataframe object on console
    print(dfObj)
    
    print('Creating Dataframe from non compatible Dictionary')
    studentAgeData = {
        'Jack' : 12,
        'Roma' : 13,
        'Ritika' : 10,
        'Aadi' : 11
    }
    
    '''
    Creating dataframe by converting dict to list of items
    '''
    dfObj = pd.DataFrame(list(studentAgeData.items()), index=['a', 'b', 'c', 'd'])
    
    # Print Dataframe object on console
    print(dfObj)
    
    print('Creating Dataframe from Dictionary by Skipping data')
    
    studentData = {
        'name' : ['jack', 'Riti', 'Aadi'],
        'age' : [34, 30, 16],
        'city' : ['Sydney', 'Delhi', 'New york']
    }
    
    # Creating Dataframe from Dictionary by Skipping 2nd Item from dict
    dfObj = pd.DataFrame(studentData, columns=['name', 'city'])
    
    # Print Dataframe object on console
    print(dfObj)
    
    print('Creating Dataframe from Dictionary With different orientation')
    
    # Create dataframe from dic and make keys, index in dataframe
    dfObj = pd.DataFrame.from_dict(studentData, orient='index')
    
    print(dfObj)
    
    print('Creating Dataframe from nested Dictionary')
    
    # Nested Dictionary
    studentData = {
    0 : {
        'name' : 'Aadi',
        'age' : 16,
        'city' : 'New york'
        },
    1 : {
        'name' : 'Jack',
        'age' : 34,
        'city' : 'Sydney'
        },
    2 : {
        'name' : 'Riti',
        'age' : 30,
        'city' : 'Delhi'
        }
    }
    '''
    Create dataframe from nested dictionary
    '''
    dfObj = pd.DataFrame(studentData)
    # Print Dataframe object on console
    print(dfObj)
    
    print("Transpose the dictionary")
    
    # Transpose dataframe object
    dfObj = dfObj.transpose()
  
    print(dfObj)
if __name__ == '__main__':
    main()

出力:

Creating Dataframe from Dictionary
   age      city  name
0   34    Sydney  jack
1   30     Delhi  Riti
2   16  New york  Aadi
Creating Dataframe from Dictionary and Custom Indexes
   age      city  name
a   34    Sydney  jack
b   30     Delhi  Riti
c   16  New york  Aadi
Creating Dataframe from non compatible Dictionary
        0   1
a    Aadi  11
b    Roma  13
c    Jack  12
d  Ritika  10
Creating Dataframe from Dictionary by Skipping data
   name      city
0  jack    Sydney
1  Riti     Delhi
2  Aadi  New york
Creating Dataframe from Dictionary With different orientation
           0      1         2
age       34     30        16
name    jack   Riti      Aadi
city  Sydney  Delhi  New york
Creating Dataframe from nested Dictionary
             0       1      2
age         16      34     30
city  New york  Sydney  Delhi
name      Aadi    Jack   Riti
Transpose the dictionary
  age      city  name
0  16  New york  Aadi
1  34    Sydney  Jack
2  30     Delhi  Riti


コメントを残す

メールアドレスが公開されることはありません。

Next Post

ダイヤモンド・プリンセスがコロナウイルスで大惨事になった理由

金 2月 21 , 2020
ダイアモンドプリンセスが1月20日に日本の横浜港を出港したとき、乗船中の2,666人の乗客は中国、ベトナム、台湾への旅行でくつろぐ準備ができていました。