Python dict'i bir veri çerçevesine dönüştürme


299

Aşağıdaki gibi bir Python sözlüğü var:

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

Anahtarlar Unicode tarihleridir ve değerler tamsayıdır. Ben tarihleri ​​ve karşılık gelen değerleri iki ayrı sütun olarak alarak bir panda veri çerçevesine dönüştürmek istiyorum. Örnek: col1: Tarihler col2: DateValue (tarihler hala Unicode ve tarih değerleri hala tamsayılar)

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

Bu yöndeki herhangi bir yardım çok takdir edilecektir. Bu konuda bana yardımcı olmak için panda dokümanlarında kaynak bulamıyorum.

Bir çözümün bu dikendeki her bir anahtar / değer çiftini bir diksiyona dönüştürmek olabileceğini biliyorum, böylece tüm yapı bir dikte diktesi haline gelir ve daha sonra her satırı tek tek veri çerçevesine ekleyebiliriz. Ama bunu yapmanın daha kolay ve daha doğrudan bir yolu olup olmadığını bilmek istiyorum.

Şimdiye kadar bu dikeni bir seri nesnesine dönüştürmeyi denedim ama bu sütunlar arasındaki ilişkiyi sürdürmüyor gibi görünüyor:

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

Dizin Tarih olarak bir dizi nesnesine dizin olarak dönüştürme denedim ama bazı nedenlerle tarihleri ​​karşılık gelen değerlerle eşleşmedi.
anonuser0428

kod gönderildi. Bir diktecilik oluşturmadan ve sonra her satırı ayrı ayrı eklemeden bir veri çerçevesi oluşturmanın bir yolu olup olmadığını sormak istiyorum.
anonuser0428

1
"Unicode tarihi" nedir? Şunu mu demek istediniz: ISO 8601 tarih?
Peter Mortensen

Yanıtlar:


461

Buradaki hata, DataFrame yapıcısına skaler değerlerle (değerlerin bir liste / dict / ... yani birden çok sütuna sahip olmasını beklediği) çağrılmasıdır:

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

Öğeleri sözlükten alabilirsiniz (örn. Anahtar / değer çiftleri):

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

Ama Seri yapıcısını geçmek daha mantıklı olduğunu düşünüyorum:

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 Hatanın ne anlama geldiğini anladım, temelde "Gördüğüm bir Seridir, bu yüzden Seri yapıcısını kullanın" diyor.
Andy Hayden

1
Teşekkürler - çok yararlı. Belki de bu yöntemi kullanma ile DataFrame.from_dict () kullanma arasındaki farkın ne olduğunu açıklayabilir misiniz? Kullandığınız yöntem type = pandas.core.frame.DataFrame, diğer yöntem ise type = class 'pandas.core.frame.DataFrame' döndürür. Farkı ve her yöntemin ne zaman uygun olduğunu açıklama şansınız var mı? Şimdiden teşekkürler :)
Optimesh

ikisi de benzer, from_dictoryantal bir kwarg var, bu yüzden transpozisyondan kaçınmak istersem kullanabilirim. Birkaç seçenek var from_dict, başlık altında DataFrame yapıcısını kullanmaktan gerçekten farklı değil.
Andy Hayden

54
pandas.core.common.PandasError: DataFrame constructor not properly called!İlk örnekten görüyorum
allthesignals 29:16

18
@allthesignals d.items çalışır etrafında list () eklenir: pd.DataFrame (list (d.items ()), sütunlar = ['Tarih', 'DateValue'])
sigurdb

144

Bir sözlüğü, anahtarların söz konusu veri çerçevesinin sütunları ve değerlerin satır değerleri olmasını istediğiniz bir panda veri çerçevesine dönüştürürken, sözlüğün etrafına şu şekilde parantez koyabilirsiniz:

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

Bana biraz baş ağrısı kurtardı, umarım orada birine yardım eder!

EDIT: Panda belgelerindedata DataFrame yapıcısında parametre için bir seçenek sözlüklerin bir listesidir. Burada içinde bir sözlük bulunan bir liste geçiyoruz.


6
Evet ben de yaptım ama devrik .T ekledi.
Anton vBR

1
İyi çalışıyor ama neden böyle yapmak zorunda olduğumuzu bilmiyoruz.
hui chen

bu sütunlardan birinin dizin olarak kullanılmasını istiyorsanız
om tripathi

102

Başka bir cevapta açıklandığı gibi pandas.DataFrame()doğrudan burada kullanmak düşündüğünüz gibi hareket etmeyecektir.

Ne yapabilirsiniz kullanılmasıdır pandas.DataFrame.from_dictile 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
bunu bir seferde renamedizin ve sütun adlarını ayarlamak için herhangi bir yöntemle zincirleyebilir miyiz ?
Ciprian Tomoiagă

4
iyi bir nokta. Bir örnek şöyle olabilir: ...., orient = 'index'). Rename (sütunlar = {0: 'foobar'})
ntg

1
Ayrıca pandas.DataFrame.from_dict (..., orient = 'index', column = ['foo', 'bar']) belirtebilirsiniz, bu yukarıda listelenen kaynaktan gelir .
spen.smith

iyi bir nokta, bu orijinal cevap sonra oldu pandalar .22 için geçerlidir ... Cevabımı güncellendi ...
ntg

69

Sözlük öğelerini DataFrame yapıcısına iletin ve sütun adlarını verin. Bundan sonra değerleri Datealmak için sütunu ayrıştırın Timestamp.

Python 2.x ve 3.x arasındaki farka dikkat edin:

Python 2.x'te:

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

Python 3.x'te: (ek bir 'liste' gerektirir)

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

3
Bu bana şunu verir:PandasError: DataFrame constructor not properly called!
Chris Nielsen

18
@ChrisNielsen Muhtemelen python3 kullanıyorsunuz. Deneyin:df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
Viktor Kerkez

Bu daha iyi bir yanıttır, çünkü Python 3'te ne yapılması gerektiğini gösterir.
ifly6


10

Pandalar , diktenin veri çerçevesine dönüştürülmesi için yerleşik bir işleve sahiptir .

pd.DataFrame.from_dict (dictionaryObject, şark = 'indeks')

Verileriniz için aşağıdaki gibi dönüştürebilirsiniz:

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
Bu gerçekten kötü bir çözümdür, çünkü sözlük anahtarlarını dizin olarak kaydeder.
Bir ekonomist

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

5

Ayrıca sözlüğün anahtarlarını ve değerlerini yeni veri çerçevesine aktarabilirsiniz, şöyle:

import pandas as pd

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

5

Benim durumumda bir diktenin anahtar ve değerlerinin sütun ve DataFrame değerleri olmasını istedim. Yani benim için çalışan tek şey:

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

Benim için işe yaradı, çünkü ayrı bir dizin sütunu almak istedim

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

3

Bir dikteyi bağımsız değişken olarak kabul eder ve diktenin anahtarlarını dizin ve değerlerini sütun olarak içeren bir veri çerçevesi döndürür.

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

bir dikte almak, bir veri çerçevesi döndürür
ilk önce

3

Benim için böyle çalıştı:

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

Umarım bu yardımcı olur


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

yourDict.keys()İçinde kapsülleme yapmazsanız list(), tüm anahtarlarınız ve değerleriniz her sütunun her satırına yerleştirilir. Bunun gibi:

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

Ancak ekleyerek list()sonuç şöyle görünür:

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

Bu birkaç kez içine çalıştırmak ve bir işlevden oluşturduğum get_max_Path()örnek bir sözlük var ve örnek sözlük döndürür:

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

Bunu bir veri çerçevesine dönüştürmek için aşağıdakileri çalıştırdım:

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

Ayrı bir dizine sahip iki sütunlu basit bir veri çerçevesi döndürür:

index 0 0 2 0.309750 1 3 0.441318

Yalnızca sütunları kullanarak yeniden adlandırın. f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)


0

Sözlük oluştururken veri biçiminizde bazı değişiklikler yapabileceğinizi düşünüyorum, daha sonra kolayca DataFrame'e dönüştürebilirsiniz:

giriş:

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

çıktı:

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

giriş:

aframe=DataFrame(a)

çıktı: DataFrame'iniz olacak

Sadece Sublime veya belki Excel gibi bir yerde bazı metin düzenlemeleri kullanmanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.