Bir sözlük listesini panda DataFrame'e nasıl dönüştürebilirim?
Diğer cevaplar doğrudur, ancak bu yöntemlerin avantajları ve sınırlamaları açısından fazla bir şey açıklanmamıştır. Bu yazının amacı, farklı durumlarda bu yöntemlerin örneklerini göstermek, ne zaman kullanılacağını (ve ne zaman kullanılmayacağını) tartışmak ve alternatifler önermek olacaktır.
Verilerinizin yapısına ve biçimine bağlı olarak, her üç yöntemin de çalıştığı veya bazılarının diğerlerinden daha iyi çalıştığı veya bazılarının hiç çalışmadığı durumlar vardır.
Çok tartışmalı bir örnek düşünün.
np.random.seed(0)
data = pd.DataFrame(
np.random.choice(10, (3, 4)), columns=list('ABCD')).to_dict('r')
print(data)
[{'A': 5, 'B': 0, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'C': 3, 'D': 5},
{'A': 2, 'B': 4, 'C': 7, 'D': 6}]
Bu liste mevcut her anahtarın bulunduğu "kayıtlardan" oluşur. Bu karşılaşabileceğiniz en basit durum.
# The following methods all produce the same output.
pd.DataFrame(data)
pd.DataFrame.from_dict(data)
pd.DataFrame.from_records(data)
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
Sözlük Yönelimleri Üzerine Kelime: orient='index'
/'columns'
Devam etmeden önce, farklı sözlük yönlendirmesi türleri ve pandalarla destek arasında ayrım yapmak önemlidir. İki temel tür vardır: "sütunlar" ve "dizin".
orient='columns'
"Sütun" yönelimli sözlüklerin anahtarları, eşdeğer DataFrame'deki sütunlara karşılık gelir.
Örneğin, data
yukarıdaki "sütunlar" yönündedir.
data_c = [
{'A': 5, 'B': 0, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'C': 3, 'D': 5},
{'A': 2, 'B': 4, 'C': 7, 'D': 6}]
pd.DataFrame.from_dict(data_c, orient='columns')
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
Not: Kullanıyorsanız pd.DataFrame.from_records
, yönlendirmenin "sütun" olduğu varsayılır (başka türlü belirtemezsiniz) ve sözlükler buna göre yüklenir.
orient='index'
Bu yönlendirmeyle, anahtarların dizin değerlerine karşılık geldiği varsayılır. Bu tür veriler en uygunudur pd.DataFrame.from_dict
.
data_i ={
0: {'A': 5, 'B': 0, 'C': 3, 'D': 3},
1: {'A': 7, 'B': 9, 'C': 3, 'D': 5},
2: {'A': 2, 'B': 4, 'C': 7, 'D': 6}}
pd.DataFrame.from_dict(data_i, orient='index')
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
Bu durum OP'de dikkate alınmaz, ancak yine de bilmek yararlıdır.
Özel Dizin Ayarlama
Sonuçta elde edilen DataFrame üzerinde özel bir dizine ihtiyacınız varsa, index=...
bağımsız değişkeni kullanarak dizini ayarlayabilirsiniz .
pd.DataFrame(data, index=['a', 'b', 'c'])
# pd.DataFrame.from_records(data, index=['a', 'b', 'c'])
A B C D
a 5 0 3 3
b 7 9 3 5
c 2 4 7 6
Bu tarafından desteklenmiyor pd.DataFrame.from_dict
.
Eksik Anahtarlar / Sütunlarla İşlem
Eksik anahtar / sütun değerlerine sahip sözlükler kullanılırken tüm yöntemler kullanıma hazırdır. Örneğin,
data2 = [
{'A': 5, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'F': 5},
{'B': 4, 'C': 7, 'E': 6}]
# The methods below all produce the same output.
pd.DataFrame(data2)
pd.DataFrame.from_dict(data2)
pd.DataFrame.from_records(data2)
A B C D E F
0 5.0 NaN 3.0 3.0 NaN NaN
1 7.0 9.0 NaN NaN NaN 5.0
2 NaN 4.0 7.0 NaN 6.0 NaN
Sütunların Alt Kümesini Okuma
"Ya her bir sütunda okumak istemezsem?" columns=...
Parametreyi kullanarak bunu kolayca belirleyebilirsiniz .
Örneğin, data2
yukarıdaki örnek sözlüğe göre , yalnızca "A", "D" ve "F" sütunlarını okumak istiyorsanız, bunu bir listeyi ileterek yapabilirsiniz:
pd.DataFrame(data2, columns=['A', 'D', 'F'])
# pd.DataFrame.from_records(data2, columns=['A', 'D', 'F'])
A D F
0 5.0 3.0 NaN
1 7.0 NaN 5.0
2 NaN NaN NaN
Bu, pd.DataFrame.from_dict
varsayılan yönlendirme "sütunları" ile desteklenmez .
pd.DataFrame.from_dict(data2, orient='columns', columns=['A', 'B'])
ValueError: cannot use columns parameter with orient='columns'
Satır Alt Kümesini Okuma
Bu yöntemlerin hiçbiri doğrudan desteklenmez . Verilerinizi tekrarlamanız ve tekrarlarken yerinde ters silme yapmanız gerekecektir . Örneğin, sadece 0 ayıklamak için th ve 2 nd satırları data2
yukarıdaki, şunları kullanabilirsiniz:
rows_to_select = {0, 2}
for i in reversed(range(len(data2))):
if i not in rows_to_select:
del data2[i]
pd.DataFrame(data2)
# pd.DataFrame.from_dict(data2)
# pd.DataFrame.from_records(data2)
A B C D E
0 5.0 NaN 3 3.0 NaN
1 NaN 4.0 7 NaN 6.0
Her derde deva: json_normalize
İç İçe Veri için
Yukarıda özetlenen yöntemlere güçlü ve sağlam bir alternatif json_normalize
, sözlük listeleri (kayıtları) ile çalışan ve ayrıca iç içe sözlükleri de işleyebilen işlevdir.
pd.io.json.json_normalize(data)
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
pd.io.json.json_normalize(data2)
A B C D E
0 5.0 NaN 3 3.0 NaN
1 NaN 4.0 7 NaN 6.0
Yine, iletilen verilerin json_normalize
sözlükler listesi (kayıtlar) biçiminde olması gerektiğini unutmayın.
Belirtildiği gibi, json_normalize
iç içe sözlükleri de işleyebilir. Dokümanlardan alınan bir örnek.
data_nested = [
{'counties': [{'name': 'Dade', 'population': 12345},
{'name': 'Broward', 'population': 40000},
{'name': 'Palm Beach', 'population': 60000}],
'info': {'governor': 'Rick Scott'},
'shortname': 'FL',
'state': 'Florida'},
{'counties': [{'name': 'Summit', 'population': 1234},
{'name': 'Cuyahoga', 'population': 1337}],
'info': {'governor': 'John Kasich'},
'shortname': 'OH',
'state': 'Ohio'}
]
pd.io.json.json_normalize(data_nested,
record_path='counties',
meta=['state', 'shortname', ['info', 'governor']])
name population state shortname info.governor
0 Dade 12345 Florida FL Rick Scott
1 Broward 40000 Florida FL Rick Scott
2 Palm Beach 60000 Florida FL Rick Scott
3 Summit 1234 Ohio OH John Kasich
4 Cuyahoga 1337 Ohio OH John Kasich
meta
Ve record_path
bağımsız değişkenleri hakkında daha fazla bilgi için belgelere bakın.
Özetleme
Aşağıda, desteklenen özelliklerin / işlevlerin yanı sıra yukarıda tartışılan tüm yöntemlerin bir tablosu bulunmaktadır.
* orient='columns'
İle aynı efekti elde etmek için kullanın ve sonra transpoze edin orient='index'
.