Ubah Python dict menjadi dataframe


299

Saya memiliki kamus Python seperti berikut:

{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}

Kuncinya adalah tanggal Unicode dan nilainya adalah bilangan bulat. Saya ingin mengonversinya menjadi panda dataframe dengan memiliki tanggal dan nilainya sesuai dengan dua kolom terpisah. Contoh: col1: Tanggal col2: DateValue (tanggal masih Unicode dan nilai tanggal masih bilangan bulat)

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

Bantuan apa pun ke arah ini akan sangat dihargai. Saya tidak dapat menemukan sumber daya pada dokumen panda untuk membantu saya dalam hal ini.

Saya tahu satu solusi mungkin untuk mengubah setiap pasangan kunci-nilai dalam dict ini, menjadi dict sehingga seluruh struktur menjadi dict dicts, dan kemudian kita dapat menambahkan setiap baris secara individual ke dalam dataframe. Tetapi saya ingin tahu apakah ada cara yang lebih mudah dan lebih langsung untuk melakukan ini.

Sejauh ini saya telah mencoba mengubah dict menjadi objek seri tetapi ini tampaknya tidak mempertahankan hubungan antara kolom:

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

Saya telah mencoba mengubah dict menjadi objek seri dengan tanggal sebagai indeks tetapi itu tidak cocok dengan tanggal dengan nilai yang sesuai untuk beberapa alasan.
anonuser0428

kode telah diposkan. Saya ingin menanyakan apakah ada cara untuk membuat kerangka data tanpa membuat dict-of-dicts dan kemudian menambahkan setiap baris secara terpisah.
anonuser0428

1
Apa itu "Tanggal Unicode"? Apakah maksud Anda tanggal ISO 8601 ?
Peter Mortensen

Jawaban:


461

Kesalahan di sini adalah sejak memanggil konstruktor DataFrame dengan nilai skalar (di mana ia mengharapkan nilai menjadi daftar / dict / ... yaitu memiliki beberapa kolom):

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

Anda bisa mengambil item dari kamus (yaitu pasangan nilai kunci):

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

Tapi saya pikir lebih masuk akal untuk melewati konstruktor Seri:

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 Saya menyadari apa artinya kesalahan sekarang, pada dasarnya mengatakan "Apa yang saya lihat adalah Seri, jadi gunakan Seri konstruktor".
Andy Hayden

1
Terima kasih - sangat membantu. Bisakah Anda menjelaskan apa perbedaan antara menggunakan metode ini dan menggunakan DataFrame.from_dict ()? Metode Anda (yang saya gunakan) mengembalikan tipe = pandas.core.frame.DataFrame, sedangkan yang lain mengembalikan tipe = class 'pandas.core.frame.DataFrame'. Apakah ada peluang Anda bisa menjelaskan perbedaannya dan kapan masing-masing metode tepat? Terima kasih sebelumnya :)
Optimesh

keduanya sama, from_dictmemiliki orientasi kwarg, jadi saya mungkin menggunakannya jika saya ingin menghindari transposing. Ada beberapa opsi dengan from_dict, di bawah tenda itu tidak benar-benar berbeda dari menggunakan konstruktor DataFrame.
Andy Hayden

54
Saya melihat pandas.core.common.PandasError: DataFrame constructor not properly called!dari contoh pertama
allthesignals

18
@allthesignals menambahkan daftar () di sekitar d.items berfungsi: pd.DataFrame (daftar (d.items ()), kolom = ['Date', 'DateValue'])
sigurdb

142

Saat mengonversi kamus ke dalam kerangka data panda di mana Anda ingin kunci menjadi kolom kerangka data tersebut dan nilai-nilai tersebut menjadi nilai baris, Anda dapat melakukannya dengan menaruh tanda kurung di sekeliling kamus seperti ini:

>>> 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

Ini menyelamatkan saya dari sakit kepala, jadi saya harap ini membantu seseorang di luar sana!

EDIT: Dalam dokumen panda satu opsi untuk dataparameter dalam konstruktor DataFrame adalah daftar kamus. Di sini kita melewati daftar dengan satu kamus di dalamnya.


6
Ya saya juga melakukan ini tetapi menambahkan .T untuk memindahkan.
Anton vBR

1
Ini berfungsi dengan baik tetapi tidak tahu mengapa kita harus melakukannya seperti ini.
hui chen

bagaimana jika saya ingin satu kolom ini digunakan sebagai indeks
om tripathi

102

Seperti yang dijelaskan pada jawaban lain menggunakan pandas.DataFrame()langsung di sini tidak akan bertindak seperti yang Anda pikirkan.

Apa yang dapat Anda lakukan adalah menggunakan pandas.DataFrame.from_dictdengan orient='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
dapatkah kita mengaitkan ini dengan renamemetode apa pun untuk menetapkan nama indeks dan kolom sekaligus?
Ciprian Tomoiagă

4
Poin yang bagus. Salah satu contohnya adalah: ...., orient = 'index'). Rename (kolom = {0: 'foobar'})
ntg

1
Anda juga dapat menentukan pandas.DataFrame.from_dict (..., orient = 'index', kolom = ['foo', 'bar']), ini berasal dari sumber yang tercantum di atas .
spen.smith

Poin bagus, ini benar dari panda .22 yang setelah jawaban asli ... Diperbarui jawaban saya ...
ntg

69

Lewati item kamus ke konstruktor DataFrame, dan berikan nama kolom. Setelah itu parsing Datekolom untuk mendapatkan Timestampnilai.

Perhatikan perbedaan antara python 2.x dan 3.x:

Dengan python 2.x:

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

Dalam Python 3.x: (membutuhkan 'daftar' tambahan)

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

3
Ini memberi saya:PandasError: DataFrame constructor not properly called!
Chris Nielsen

18
@ ChrisNielsen Anda mungkin menggunakan python3. Anda harus mencoba:df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
Viktor Kerkez

Ini adalah jawaban yang lebih baik karena ini menunjukkan apa yang harus dilakukan dengan Python 3.
ifly6


10

Panda memiliki fungsi bawaan untuk konversi dict ke frame data.

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

Untuk data Anda, Anda dapat mengonversinya seperti di bawah ini:

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
Itu solusi yang sangat buruk, karena menyimpan kunci kamus sebagai indeks.
Seorang ekonom

6
pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })

5

Anda juga bisa meneruskan kunci dan nilai kamus ke kerangka data baru, seperti:

import pandas as pd

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

5

Dalam kasus saya, saya ingin kunci dan nilai dict menjadi kolom dan nilai DataFrame. Jadi satu-satunya hal yang berhasil untuk saya adalah:

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

Ini yang berhasil bagi saya, karena saya ingin memiliki kolom indeks terpisah

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

3

Menerima dict sebagai argumen dan mengembalikan kerangka data dengan kunci-kunci dict sebagai indeks dan nilai-nilai sebagai kolom.

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

ambil dict, kembalikan bingkai data
pertama

3

Beginilah cara kerjanya untuk saya:

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

saya harap ini membantu


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

Jika Anda tidak merangkum yourDict.keys()di dalam list(), maka Anda akan berakhir dengan semua kunci dan nilai Anda ditempatkan di setiap baris setiap kolom. Seperti ini:

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...

Tetapi dengan menambahkan list()maka hasilnya terlihat seperti ini:

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

Saya telah menjalankan beberapa kali ini dan memiliki contoh kamus yang saya buat dari suatu fungsi get_max_Path(), dan mengembalikan contoh kamus:

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

Untuk mengonversikan ini ke dataframe, saya menjalankan yang berikut ini:

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

Mengembalikan kerangka data dua kolom sederhana dengan indeks terpisah:

index 0 0 2 0.309750 1 3 0.441318

Cukup ganti nama kolom menggunakan f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)


0

Saya pikir Anda dapat membuat beberapa perubahan dalam format data saat membuat kamus, lalu Anda dapat dengan mudah mengubahnya menjadi DataFrame:

memasukkan:

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

keluaran:

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

memasukkan:

aframe=DataFrame(a)

output: akan menjadi DataFrame Anda

Anda hanya perlu menggunakan beberapa pengeditan teks di suatu tempat seperti Sublime atau mungkin Excel.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.