Mam listę takich słowników:
[{'points': 50, 'time': '5:00', 'year': 2010},
{'points': 25, 'time': '6:00', 'month': "february"},
{'points':90, 'time': '9:00', 'month': 'january'},
{'points_h1':20, 'month': 'june'}]
I chcę zmienić to w pandy DataFrame
taką:
month points points_h1 time year
0 NaN 50 NaN 5:00 2010
1 february 25 NaN 6:00 NaN
2 january 90 NaN 9:00 NaN
3 june NaN 20 NaN NaN
Uwaga: kolejność kolumn nie ma znaczenia.
Jak mogę zmienić listę słowników w pandę DataFrame, jak pokazano powyżej?
python
dictionary
pandas
dataframe
appleLover
źródło
źródło
df = df.set_index('time')
późniejpandas.DataFrame
'{"":{"...
używasz metody json_normalize, zapoznaj się ze szczegółową odpowiedzią @ cs95Pozostałe odpowiedzi są poprawne, ale niewiele wyjaśniono w kategoriach zalet i ograniczeń tych metod. Celem tego postu będzie pokazanie przykładów tych metod w różnych sytuacjach, omówienie, kiedy stosować (a kiedy nie) i zaproponowanie alternatyw.
DataFrame()
,DataFrame.from_records()
i.from_dict()
W zależności od struktury i formatu danych istnieją sytuacje, w których albo wszystkie trzy metody działają, albo niektóre działają lepiej niż inne, albo niektóre wcale nie działają.
Rozważ bardzo wymyślony przykład.
Ta lista składa się z „zapisów” z każdym kluczem. To najprostszy przypadek, jaki można napotkać.
Słowo na temat orientacji słownika:
orient='index'
/'columns'
Zanim przejdziesz dalej, ważne jest, aby wprowadzić rozróżnienie między różnymi typami orientacji słownikowych i wspierać pandy. Istnieją dwa podstawowe typy: „kolumny” i „indeks”.
orient='columns'
Słowniki o orientacji „kolumny” będą miały klucze odpowiadające kolumnom w równoważnej ramce danych.
Na przykład
data
powyżej znajduje się w orientacji „kolumny”.Uwaga: Jeśli używasz
pd.DataFrame.from_records
, zakłada się, że orientacja to „kolumny” (nie można określić inaczej), a słowniki zostaną odpowiednio załadowane.orient='index'
Przy takim ukierunkowaniu zakłada się, że klucze odpowiadają wartościom indeksu. Tego rodzaju dane najlepiej nadają się
pd.DataFrame.from_dict
.Ten przypadek nie jest rozpatrywany w PO, ale nadal warto o nim wiedzieć.
Ustawianie indeksu niestandardowego
Jeśli potrzebujesz wynikowego indeksu w wynikowej ramce danych, możesz ustawić go za pomocą
index=...
argumentu.To nie jest obsługiwane przez
pd.DataFrame.from_dict
.Radzenie sobie z brakującymi kluczami / kolumnami
Wszystkie metody działają od razu po wyjęciu z pudełka podczas obsługi słowników z brakującymi wartościami kluczy / kolumn. Na przykład,
Czytanie podzbioru kolumn
„Co jeśli nie chcę czytać w każdej kolumnie”? Możesz to łatwo określić za pomocą
columns=...
parametru.Na przykład z powyższego słownika
data2
, jeśli chcesz czytać tylko kolumny „A”, „D” i „F”, możesz to zrobić, przekazując listę:Nie jest to obsługiwane przez
pd.DataFrame.from_dict
domyślny orient „kolumny”.Czytanie podzbioru wierszy
Nie jest obsługiwany przez każdy z tych metod bezpośrednio . Będziesz musiał wykonać iterację swoich danych i wykonać odwrotne usuwanie w miejscu podczas iteracji. Na przykład, aby wyodrębnić tylko 0 th i 2 nd wiersze z
data2
powyżej, można użyć:Panacea:
json_normalize
dla danych zagnieżdżonychSilną, niezawodną alternatywą dla metod opisanych powyżej jest
json_normalize
funkcja, która działa z listami słowników (rekordów), a ponadto może obsługiwać zagnieżdżone słowniki.Ponownie pamiętaj, że przekazywane dane
json_normalize
muszą mieć format listy słowników (rekordów).Jak wspomniano,
json_normalize
może również obsługiwać zagnieżdżone słowniki. Oto przykład zaczerpnięty z dokumentacji.Więcej informacji na temat argumentów
meta
i znajdujerecord_path
się w dokumentacji.Zreasumowanie
Oto tabela wszystkich metod omówionych powyżej, wraz z obsługiwanymi funkcjami / funkcjonalnością.
* Użyj,
orient='columns'
a następnie transponuj, aby uzyskać taki sam efekt jakorient='index'
.źródło
W pandach 16.2 musiałem zrobić,
pd.DataFrame.from_records(d)
żeby to zadziałało.źródło
deque
0.17.1
pandami z rozwiązaniem @joris0.18.1
należy użyć,from_records
jeśli wszystkie słowniki nie mają takich samych kluczy.Możesz także użyć
pd.DataFrame.from_dict(d)
jako:źródło
dict
s, a nie z jednegodict
, jak zakłada się w swojej odpowiedzi.Wiem, że kilka osób się z tym spotka i nic tu nie pomoże. Najłatwiejszy sposób, jaki to zrobiłem, to:
Mam nadzieję, że to komuś pomoże!
źródło
i proste połączenie:
źródło
źródło
Aby przekonwertować listę słowników na pandę DataFrame, możesz użyć „append”:
Mamy słownik nazywa
dic
i DIC posiada 30 Pozycji (list1
,list2
, ...,list30
)total_df
)total_df
pomocąlist1
total_df
źródło
DataFrame()
,DataFrame.from_records()
i.from_dict()
?