मैं शब्दकोशों की सूची को पांडा डेटाफ़्रेम में कैसे परिवर्तित करूँ?
अन्य उत्तर सही हैं, लेकिन इन तरीकों के फायदे और सीमाओं के संदर्भ में बहुत कुछ नहीं बताया गया है। इस पोस्ट का उद्देश्य विभिन्न तरीकों के तहत इन तरीकों के उदाहरणों को दिखाना होगा, चर्चा करना कि कब उपयोग करना है (कब उपयोग नहीं करना है) और विकल्प सुझाएं।
आपके डेटा की संरचना और प्रारूप के आधार पर, ऐसी परिस्थितियाँ हैं जहाँ या तो सभी तीन विधियाँ काम करती हैं, या कुछ अन्य की तुलना में बेहतर काम करती हैं, या कुछ बिल्कुल भी काम नहीं करती हैं।
एक बहुत ही विवादित उदाहरण पर विचार करें।
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}]
इस सूची में मौजूद हर कुंजी के साथ "रिकॉर्ड" हैं। यह सबसे आसान मामला है जिसका आप सामना कर सकते हैं।
# 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
शब्दकोश अभिविन्यास पर शब्द: orient='index'
/'columns'
जारी रखने से पहले, विभिन्न प्रकार के शब्दकोश अभिविन्यासों के बीच अंतर करना महत्वपूर्ण है, और पांडा के साथ समर्थन करना। दो प्राथमिक प्रकार हैं: "कॉलम", और "इंडेक्स"।
orient='columns'
"कॉलम" अभिविन्यास वाले शब्दकोशों में उनकी कुंजियाँ बराबर DataFrame में कॉलम के अनुरूप होंगी।
उदाहरण के लिए, data
ऊपर "कॉलम" ओरिएंट में है।
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
नोट: यदि आप उपयोग कर रहे हैं pd.DataFrame.from_records
, तो अभिविन्यास को "कॉलम" माना जाता है (आप अन्यथा निर्दिष्ट नहीं कर सकते हैं), और शब्दकोशों को तदनुसार लोड किया जाएगा।
orient='index'
इस अभिविन्यास के साथ, सूचकांक मानों के अनुरूप कुंजियों को ग्रहण किया जाता है। इस तरह के डेटा के लिए सबसे उपयुक्त है 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
इस मामले को ओपी में नहीं माना जाता है, लेकिन यह जानना उपयोगी है।
कस्टम इंडेक्स सेट करना
यदि आपको परिणामी DataFrame पर एक कस्टम इंडेक्स की आवश्यकता है, तो आप इसे index=...
तर्क का उपयोग करके सेट कर सकते हैं ।
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
यह द्वारा समर्थित नहीं है pd.DataFrame.from_dict
।
गुम कुंजी / कॉलम से निपटना
अनुपलब्ध कुंजियों / स्तंभ मानों के साथ शब्दकोशों को संभालने पर सभी विधियाँ आउट-ऑफ-द-बॉक्स काम करती हैं। उदाहरण के लिए,
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
कॉलम के सबसेट पढ़ना
"क्या होगा अगर मैं हर एक कॉलम में नहीं पढ़ना चाहता"? आप columns=...
पैरामीटर का उपयोग करके इसे आसानी से निर्दिष्ट कर सकते हैं ।
उदाहरण के लिए, data2
ऊपर के उदाहरण शब्दकोश से, यदि आप केवल कॉलम "ए ',' डी 'और' एफ 'पढ़ना चाहते हैं, तो आप एक सूची पास करके ऐसा कर सकते हैं:
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
यह pd.DataFrame.from_dict
डिफ़ॉल्ट ओरिएंट "कॉलम" के साथ समर्थित नहीं है ।
pd.DataFrame.from_dict(data2, orient='columns', columns=['A', 'B'])
ValueError: cannot use columns parameter with orient='columns'
पंक्तियों की सबसेट पढ़ना
सीधे इन तरीकों में से किसी के द्वारा समर्थित नहीं है । आपको अपने डेटा पर पुनरावृति करना होगा और जैसे ही आप पुनरावृत्त होते हैं, एक रिवर्स डिलीट इन-प्लेस करें। उदाहरण के लिए, ऊपर से केवल 0 वीं और 2 एनडी पंक्तियों को निकालने के लिए, data2
आप इसका उपयोग कर सकते हैं:
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
द पैनसीया: json_normalize
नेस्टेड डेटा के लिए
ऊपर उल्लिखित विधियों के लिए एक मजबूत, मजबूत विकल्प वह json_normalize
फ़ंक्शन है जो शब्दकोशों (रिकॉर्ड्स) की सूचियों के साथ काम करता है, और इसके अलावा शून्य शब्दकोशों को भी संभाल सकता है।
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
फिर, ध्यान रखें कि डेटा json_normalize
को सूची-ऑफ-डिक्शनरी (रिकॉर्ड) प्रारूप में होना चाहिए।
जैसा कि उल्लेख किया गया है, json_normalize
नेस्टेड शब्दकोशों को भी संभाल सकता है। यहाँ प्रलेखन से लिया गया एक उदाहरण है।
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
और record_path
तर्कों पर अधिक जानकारी के लिए , दस्तावेज़ीकरण देखें।
सारांश
यहाँ समर्थित विशेषताओं / कार्यक्षमता के साथ उपरोक्त सभी तरीकों की तालिका दी गई है।
* का उपयोग करें orient='columns'
और फिर के रूप में एक ही प्रभाव प्राप्त करने के लिए स्थानांतरित orient='index'
।