Python dictをデータフレームに変換する


299

次のようなPython辞書があります。

{u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 u'2012-06-13': 389,
 u'2012-06-14': 389,
 u'2012-06-15': 389,
 u'2012-06-16': 389,
 u'2012-06-17': 389,
 u'2012-06-18': 390,
 u'2012-06-19': 390,
 u'2012-06-20': 390,
 u'2012-06-21': 390,
 u'2012-06-22': 390,
 u'2012-06-23': 390,
 u'2012-06-24': 390,
 u'2012-06-25': 391,
 u'2012-06-26': 391,
 u'2012-06-27': 391,
 u'2012-06-28': 391,
 u'2012-06-29': 391,
 u'2012-06-30': 391,
 u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

キーはUnicodeの日付で、値は整数です。日付とそれに対応する値を2つの別々の列として持つことで、これをpandasデータフレームに変換したいと思います。例:col1:日付col2:DateValue(日付はUnicodeのままで、datevalueは整数のまま)

     Date         DateValue
0    2012-07-01    391
1    2012-07-02    392
2    2012-07-03    392
.    2012-07-04    392
.    ...           ...
.    ...           ...

この方向で何か助けていただければ幸いです。私はこれを手助けするパンダのドキュメントでリソースを見つけることができません。

1つの解決策は、この辞書の各キーと値のペアを辞書に変換して、構造全体が辞書の辞書になるようにし、各行を個別にデータフレームに追加できることです。しかし、これを行うためのより簡単な方法とより直接的な方法があるかどうかを知りたいです。

これまでは、dictをseriesオブジェクトに変換してみましたが、これは列間の関係を維持していないようです:

s  = Series(my_dict,index=my_dict.keys())

日付をインデックスとして使用して、dictをシリーズオブジェクトに変換しようとしましたが、何らかの理由で日付と対応する値が一致しませんでした。
anonuser0428 2013

コードが投稿されました。dict-of-dictsを作成せずに各行を個別に追加せずにデータフレームを作成する方法があるかどうかを確認したいと思います。
anonuser0428 2013

1
「Unicode日付」とは何ですか?あなたは意味するかISO 8601の日付を?
Peter Mortensen

回答:


461

ここでのエラーは、DataFrameコンストラクターをスカラー値で呼び出すためです(ここでは、値がlist / dict / ...であることが期待されています。つまり、複数の列があります)。

pd.DataFrame(d)
ValueError: If using all scalar values, you must must pass an index

辞書から項目を取得できます(つまり、キーと値のペア)。

In [11]: pd.DataFrame(d.items())  # or list(d.items()) in python 3
Out[11]:
             0    1
0   2012-07-02  392
1   2012-07-06  392
2   2012-06-29  391
3   2012-06-28  391
...

In [12]: pd.DataFrame(d.items(), columns=['Date', 'DateValue'])
Out[12]:
          Date  DateValue
0   2012-07-02        392
1   2012-07-06        392
2   2012-06-29        391

しかし、Seriesコンストラクターを渡す方が理にかなっていると思います。

In [21]: s = pd.Series(d, name='DateValue')
Out[21]:
2012-06-08    388
2012-06-09    388
2012-06-10    388

In [22]: s.index.name = 'Date'

In [23]: s.reset_index()
Out[23]:
          Date  DateValue
0   2012-06-08        388
1   2012-06-09        388
2   2012-06-10        388

4
@ user1009091エラーが何を意味するかを理解しました。基本的に、「表示されているのはSeriesなので、Seriesコンストラクターを使用します」と言っています。
アンディヘイデン

1
ありがとう-とても役に立ちました。このメソッドを使用することとDataFrame.from_dict()を使用することの違いは何ですか?あなたのメソッド(私が使用したもの)はtype = pandas.core.frame.DataFrameを返し、もう1つはtype = class 'pandas.core.frame.DataFrame'を返します。違いを説明して、それぞれの方法が適切な場合はありますか?事前に感謝します:)
Optimesh

どちらも似from_dictており、オリエントクワーグがあるので、転置を避けたい場合はそれを使用する場合があります。にはいくつかのオプションがありますがfrom_dict、内部的には、DataFrameコンストラクターを使用する場合とほとんど変わりません。
アンディヘイデン

54
pandas.core.common.PandasError: DataFrame constructor not properly called!最初の例から見てみましょう
allthesignals

18
@allthesignalsがd.itemsの周囲にlist()を追加すると機能します:pd.DataFrame(list(d.items())、columns = ['Date'、 'DateValue'])
sigurdb

141

辞書をpandasデータフレームに変換し、キーを上記のデータフレームの列に、値を行の値にしたい場合は、次のように辞書を角括弧で囲むだけです。

>>> dict_ = {'key 1': 'value 1', 'key 2': 'value 2', 'key 3': 'value 3'}
>>> pd.DataFrame([dict_])

    key 1     key 2     key 3
0   value 1   value 2   value 3

それは私にいくつかの頭痛を救ったので、それがそこの誰かを助けることを願っています!

編集:パンダのドキュメントdataでは、DataFrameコンストラクターのパラメーターの1つのオプションは、辞書のリストです。ここでは、1つの辞書を含むリストを渡します。


6
はい、私もこれを行いましたが、転置するために.Tを追加しました。
アントンvBR 2018

1
それは正常に動作しますが、なぜこのようにする必要があるのか​​わかりません。
hui chen

これらの列の1つをインデックスとして使用したい場合
om tripathi

102

別の答えで説明したように、pandas.DataFrame()ここで直接使用すると、思ったように動作しません。

あなたにできることは、使用されるpandas.DataFrame.from_dictorient='index'

In[7]: pandas.DataFrame.from_dict({u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 .....
 u'2012-07-05': 392,
 u'2012-07-06': 392}, orient='index', columns=['foo'])
Out[7]: 
            foo
2012-06-08  388
2012-06-09  388
2012-06-10  388
2012-06-11  389
2012-06-12  389
........
2012-07-05  392
2012-07-06  392

1
これを任意のrenameメソッドとチェーンして、インデックス列の名前も一度に設定できますか?
CiprianTomoiagă2017年

4
いい視点ね。たとえば、....、orient = 'index')。rename(columns = {0: 'foobar'})
ntg

1
また、pandas.DataFrame.from_dict(...、orient = 'index'、columns = ['foo'、 'bar'])を指定することもできます。これは、上記のソースからのものです
spen.smith

良い点、これは元の回答の後のパンダ.22から当てはまります...私の回答を更新しました...
ntg '14

69

辞書の項目をDataFrameコンストラクターに渡し、列名を指定します。その後、Date列を解析してTimestamp値を取得します。

python 2.xと3.xの違いに注意してください。

Python 2.xの場合:

df = pd.DataFrame(data.items(), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])

Python 3.xの場合:(追加の「リスト」が必要)

df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])

3
これは私に与える:PandasError: DataFrame constructor not properly called!
クリス・ニールセン

18
@ChrisNielsenおそらくpython3を使用しています。試してみてください:df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
Viktor Kerkez

それは、Python 3に何をしなければならないかを示すため、これは良い答えです
ifly6


10

パンダには、dictをデータフレームに変換するための組み込み関数があります。

pd.DataFrame.from_dict(dictionaryObject、orient = 'index')

あなたのデータについては、以下のように変換できます:

import pandas as pd
your_dict={u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 u'2012-06-13': 389,
 u'2012-06-14': 389,
 u'2012-06-15': 389,
 u'2012-06-16': 389,
 u'2012-06-17': 389,
 u'2012-06-18': 390,
 u'2012-06-19': 390,
 u'2012-06-20': 390,
 u'2012-06-21': 390,
 u'2012-06-22': 390,
 u'2012-06-23': 390,
 u'2012-06-24': 390,
 u'2012-06-25': 391,
 u'2012-06-26': 391,
 u'2012-06-27': 391,
 u'2012-06-28': 391,
 u'2012-06-29': 391,
 u'2012-06-30': 391,
 u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

your_df_from_dict=pd.DataFrame.from_dict(your_dict,orient='index')
print(your_df_from_dict)

2
は辞書キーをインデックスとして保存するため、これは本当に悪い解決策です。
エコノミスト


5

次のように、ディクショナリのキーと値を新しいデータフレームに渡すこともできます。

import pandas as pd

myDict = {<the_dict_from_your_example>]
df = pd.DataFrame()
df['Date'] = myDict.keys()
df['DateValue'] = myDict.values()

5

私の場合、dictのキーと値をDataFrameの列と値にする必要がありました。だから私のために働いた唯一のものは:

data = {'adjust_power': 'y', 'af_policy_r_submix_prio_adjust': '[null]', 'af_rf_info': '[null]', 'bat_ac': '3500', 'bat_capacity': '75'} 

columns = list(data.keys())
values = list(data.values())
arr_len = len(values)

pd.DataFrame(np.array(values, dtype=object).reshape(1, arr_len), columns=columns)

5

別のインデックス列が必要だったので、これは私にとってうまくいきました

df = pd.DataFrame.from_dict(some_dict, orient="index").reset_index()
df.columns = ['A', 'B']

3

dictを引数として受け入れ、dictのキーをインデックスとして、値を列としてデータフレームを返します。

def dict_to_df(d):
    df=pd.DataFrame(d.items())
    df.set_index(0, inplace=True)
    return df

口述を取り、データフレームを返します
まず、

3

これは私にとってどのように機能したかです:

df= pd.DataFrame([d.keys(), d.values()]).T
df.columns= ['keys', 'values']  # call them whatever you like

これが役に立てば幸い


1
d = {'Date': list(yourDict.keys()),'Date_Values': list(yourDict.values())}
df = pandas.DataFrame(data=d)

yourDict.keys()内にカプセル化しない場合list()、すべてのキーと値がすべての列のすべての行に配置されることになります。このような:

Date \ 0 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
1 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
2 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
3 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
4 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...

しかし追加するlist()と、結果は次のようになります。

Date Date_Values 0 2012-06-08 388 1 2012-06-09 388 2 2012-06-10 388 3 2012-06-11 389 4 2012-06-12 389 ...


0

私はこれに数回遭遇し、関数から作成したget_max_Path()サンプル辞書を持っています、そしてそれはサンプル辞書を返します:

{2: 0.3097502930247044, 3: 0.4413177909384636, 4: 0.5197224051562838, 5: 0.5717654946470984, 6: 0.6063959031223476, 7: 0.6365209824708223, 8: 0.655918861281035, 9: 0.680844386645206}

これをデータフレームに変換するために、以下を実行しました。

df = pd.DataFrame.from_dict(get_max_path(2), orient = 'index').reset_index()

個別のインデックスを持つ単純な2列のデータフレームを返します。

index 0 0 2 0.309750 1 3 0.441318

を使用して列の名前を変更するだけです f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)


0

辞書を作成するときにデータ形式にいくつかの変更を加えることができ、それを簡単にDataFrameに変換できると思います。

入力:

a={'Dates':['2012-06-08','2012-06-10'],'Date_value':[388,389]}

出力:

{'Date_value': [388, 389], 'Dates': ['2012-06-08', '2012-06-10']}

入力:

aframe=DataFrame(a)

出力:DataFrameになります

SublimeやExcelなどのどこかでテキスト編集を使用する必要があるだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.