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())
anonuser0428
sumber
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
Andy Hayden
sumber
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.

cheevahagadog
sumber
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
ntg
sumber
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'])
Viktor Kerkez
sumber
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)
Suat Atan PhD
sumber
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() })
Nader Hisham
sumber
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()
Blairg23
sumber
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)
Artem Zaika
sumber
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']
John Doe
sumber
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
pertama
sumber
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

Soufiane Chami
sumber
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 ...

Kode NL23
sumber
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)

Bryan Butler
sumber
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.

arman nemat pasand
sumber