Mam słownik Python, taki jak poniżej:
{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}
Kluczami są daty Unicode, a wartościami są liczby całkowite. Chciałbym przekonwertować to na ramkę danych pandy, mając daty i odpowiadające im wartości jako dwie osobne kolumny. Przykład: col1: Daty col2: DateValue (daty są nadal Unicode, a wartości wartości wciąż są liczbami całkowitymi)
Date DateValue
0 2012-07-01 391
1 2012-07-02 392
2 2012-07-03 392
. 2012-07-04 392
. ... ...
. ... ...
Każda pomoc w tym kierunku byłaby mile widziana. Nie mogę znaleźć zasobów w dokumentach pand, aby mi w tym pomóc.
Wiem, że jednym rozwiązaniem może być konwersja każdej pary klucz-wartość w tym dykcie, w dykt, aby cała struktura stała się dyktą dykt, a następnie możemy dodać każdy wiersz osobno do ramki danych. Ale chcę wiedzieć, czy istnieje łatwiejszy i bardziej bezpośredni sposób.
Do tej pory próbowałem przekształcić dict w obiekt szeregowy, ale wydaje się, że to nie utrzymuje relacji między kolumnami:
s = Series(my_dict,index=my_dict.keys())
Odpowiedzi:
Błąd polega na tym, że wywołanie konstruktora DataFrame z wartościami skalarnymi (gdzie oczekuje się, że wartości będą listą / dict / ... tj. Będą miały wiele kolumn):
Możesz pobrać elementy ze słownika (tj. Pary klucz-wartość):
Ale myślę, że bardziej sensowne jest przekazanie konstruktora Series:
źródło
from_dict
ma orient kwarg, więc mógłbym go użyć, gdybym chciał uniknąć transpozycji. Istnieje kilka opcjifrom_dict
, pod maską nie różni się tak naprawdę od używania konstruktora DataFrame.pandas.core.common.PandasError: DataFrame constructor not properly called!
z pierwszego przykładuKonwertując słownik na ramkę danych pandy, w której chcesz, aby klucze były kolumnami wspomnianej ramki danych, a wartości były wartościami wierszy, możesz po prostu umieścić nawiasy wokół słownika w następujący sposób:
Uratowało mnie to od bólu głowy, więc mam nadzieję, że pomoże komuś tam!
EDYCJA: W dokumentach pandas jedną z opcji
data
parametru w konstruktorze DataFrame jest lista słowników. Tutaj podajemy listę z jednym słownikiem.źródło
Jak wyjaśniono w innej odpowiedzi, użycie
pandas.DataFrame()
bezpośrednio tutaj nie będzie działać tak, jak myślisz.Co można zrobić, to użycie
pandas.DataFrame.from_dict
zorient='index'
:źródło
rename
metodą, aby jednocześnie ustawić nazwy indeksu i kolumn?Przekaż elementy słownika do konstruktora DataFrame i podaj nazwy kolumn. Następnie przeanalizuj
Date
kolumnę, aby uzyskaćTimestamp
wartości.Zwróć uwagę na różnicę między python 2.x a 3.x:
W python 2.x:
W Pythonie 3.x: (wymagający dodatkowej „listy”)
źródło
PandasError: DataFrame constructor not properly called!
df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
ps w szczególności znalazłem pomocne przykłady zorientowane na rzędy; ponieważ często w ten sposób zapisy są przechowywane na zewnątrz.
https://pbpython.com/pandas-list-dict.html
źródło
Pandy mają wbudowaną funkcję konwersji dict na ramkę danych.
Dla swoich danych możesz je przekonwertować jak poniżej:
źródło
źródło
Możesz także po prostu przekazać klucze i wartości słownika do nowej ramki danych, na przykład:
źródło
W moim przypadku chciałem, aby klucze i wartości dict były kolumnami i wartościami DataFrame. Więc jedyną rzeczą, która działała dla mnie było:
źródło
To działało dla mnie, ponieważ chciałem mieć osobną kolumnę indeksu
źródło
Akceptuje dict jako argument i zwraca ramkę danych z kluczami dict jako indeksem, a wartości jako kolumną.
źródło
Tak to dla mnie działało:
mam nadzieję, że to pomoże
źródło
Jeśli nie umieścisz w
yourDict.keys()
środkulist()
, skończysz z wszystkimi kluczami i wartościami umieszczonymi w każdym rzędzie każdej kolumny. Lubię to: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...
Ale po dodaniu
list()
wynik wygląda następująco: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 ...
źródło
Natknąłem się na to kilka razy i mam przykładowy słownik, który utworzyłem z funkcji
get_max_Path()
, i zwraca przykładowy słownik:{2: 0.3097502930247044, 3: 0.4413177909384636, 4: 0.5197224051562838, 5: 0.5717654946470984, 6: 0.6063959031223476, 7: 0.6365209824708223, 8: 0.655918861281035, 9: 0.680844386645206}
Aby przekonwertować to na ramkę danych, uruchomiłem następujące:
df = pd.DataFrame.from_dict(get_max_path(2), orient = 'index').reset_index()
Zwraca prostą dwukolumnową ramkę danych z oddzielnym indeksem:
index 0 0 2 0.309750 1 3 0.441318
Po prostu zmień nazwę kolumn za pomocą
f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)
źródło
Myślę, że można wprowadzić pewne zmiany w formacie danych podczas tworzenia słownika, a następnie łatwo przekonwertować go na DataFrame:
Wejście:
wynik:
Wejście:
wyjście: będzie twoją ramką danych
Wystarczy użyć edycji tekstu w Sublime lub Excelu.
źródło