एक पांडा के लिए शब्दकोशों की सूची परिवर्तित करें DataFrame


656

मेरे पास इस तरह के शब्दकोशों की एक सूची है:

[{'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'}]

और मैं इसे इस DataFrameतरह पंडों में बदलना चाहता हूं :

      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

नोट: स्तंभों का क्रम मायने नहीं रखता है।

जैसा कि ऊपर दिखाया गया है, मैं शब्दकोशों की सूची को पांडा डेटाफ़्रेम में कैसे बदल सकता हूँ?

जवाबों:


949

मान ddicts, बस की अपनी सूची है:

pd.DataFrame(d)

3
इंडेक्स के रूप में कुंजी / मान जोड़े में से एक का उपयोग कैसे किया जा सकता है (जैसे। समय)?
CatsLoveJazz

6
@CatsLoveJazz आप df = df.set_index('time')बाद में बस कर सकते हैं
जोर

1
@CatsLoveJazz नहीं, जब एक तानाशाह से धर्मांतरण संभव नहीं है।
जॉरिस

6
पंडों के रूप में 0.19.2, प्रलेखन में इसका कोई उल्लेख नहीं है, कम से कम डॉक्स के लिए नहींpandas.DataFrame
लियो अलेक्सेयेव

1
मन कि एक नेस्टेड शब्दकोश के लिए '{"":{"...आप json_normalize दृष्टिकोण का उपयोग करते हैं, @ cs95 का विस्तृत उत्तर देखें
लॉरेंज

136

मैं शब्दकोशों की सूची को पांडा डेटाफ़्रेम में कैसे परिवर्तित करूँ?

अन्य उत्तर सही हैं, लेकिन इन तरीकों के फायदे और सीमाओं के संदर्भ में बहुत कुछ नहीं बताया गया है। इस पोस्ट का उद्देश्य विभिन्न तरीकों के तहत इन तरीकों के उदाहरणों को दिखाना होगा, चर्चा करना कि कब उपयोग करना है (कब उपयोग नहीं करना है) और विकल्प सुझाएं।


DataFrame(), DataFrame.from_records()और.from_dict()

आपके डेटा की संरचना और प्रारूप के आधार पर, ऐसी परिस्थितियाँ हैं जहाँ या तो सभी तीन विधियाँ काम करती हैं, या कुछ अन्य की तुलना में बेहतर काम करती हैं, या कुछ बिल्कुल भी काम नहीं करती हैं।

एक बहुत ही विवादित उदाहरण पर विचार करें।

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'


8
ओह! ठीक है, साथ ही यह SO SO पोस्ट एपीआई में संबंधित है। यदि आपने पहले से ऐसा नहीं किया है तो आपको पंडों के दस्तावेज़ों में योगदान देना चाहिए। टेड पेट्रोव ने सिर्फ स्टैक ओवरफ्लो पर पांडा की लोकप्रियता के बारे में एक लिंक्डइन लेख पोस्ट किया था जिसमें उल्लेख किया गया था कि अच्छे प्रलेखन की कमी यहां प्रश्नों की मात्रा में योगदान करती है।
स्कॉट बोस्टन

2
@ScottBoston आप बिल्कुल सही हैं, मैंने सुना है कि अब पर्याप्त समय है कि मुझे पता है कि यह कुछ ऐसा है जिसे मुझे और गंभीर विचार देना चाहिए। मुझे लगता है कि दस्तावेज़ीकरण उपयोगकर्ताओं की मदद करने का एक शानदार तरीका हो सकता है, सवालों पर पोस्ट करने से अधिक, जो केवल एक ही दर्शकों के एक अंश तक पहुंचेंगे।
cs95

1
यह अच्छा जवाब है, मुझे लगता है कि यह हमारे लिए सबसे मौजूदा पांडा संस्करण :-) के तहत उन सामान्य प्रश्न में फिर से चलने के लिए समय है :-)
YOBEN_S

3
@ अच्छी तरह से: यह कभी भी यहाँ उत्तर नहीं लिखने का एक कारण हैकोई भी उत्तर पुराना हो सकता है, यही हमारे लिए मतदान है, और अलग-अलग दृष्टिकोण और अलग-अलग लक्ष्य यहां मौजूद हैं, और एक ही चीज को समझाने के अलग-अलग तरीके होना हमेशा मूल्यवान होता है।
मार्टिन पीटर्स

1
@MartijnPieters मैं सवाल करता हूं और आपके पिछले दावे से असहमत हूं लेकिन कुल मिलाकर मैं आपसे सहमत हूं। एक ही प्रश्न के अलग-अलग उत्तरों को एक साथ सम्‍मिलित करना हमेशा उपयोगी नहीं होता है, खासकर यदि कुछ उत्तर अपडेट या सशर्त अंतरों के आधार पर अन्य उत्तरों के आधार पर हों। सबसे खराब मामलों में, एक साथ टकरा जाने पर उन उत्तरों को विनाशकारी माना जा सकता है (जैसा कि पुराने उत्तर को और अधिक सही स्थिति में संपादित करने के लिए अधिक अद्यतन उत्तर का उपयोग करने का विरोध किया जाता है)। लेकिन फिर, मैं काफी हद तक आपसे सहमत हूं।
ईली

83

पांडा 16.2 में, मुझे pd.DataFrame.from_records(d)यह काम करने के लिए करना पड़ा ।


1
इस दृष्टिकोण के बारे में अच्छी बात यह है कि यह भी साथ काम करता हैdeque
MBZ

3
पांडा के 0.17.1साथ @joris समाधान के साथ ठीक काम करता है
एंटोन

2
0.14.1 usinig और @joris 'समाधान काम नहीं किया था, लेकिन ऐसा किया
mchen

13
में 0.18.1, एक का उपयोग करना चाहिए from_recordsअगर शब्दकोशों सब एक ही कुंजी नहीं है।
fredcallaway

23

आप इस pd.DataFrame.from_dict(d)रूप में भी उपयोग कर सकते हैं :

In [8]: d = [{'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'}]

In [12]: pd.DataFrame.from_dict(d)
Out[12]: 
      month  points  points_h1  time    year
0       NaN    50.0        NaN  5:00  2010.0
1  february    25.0        NaN  6:00     NaN
2   january    90.0        NaN  9:00     NaN
3      june     NaN       20.0   NaN     NaN

सवाल एक से एक डेटा फ्रेम निर्माण के बारे में है सूची की dict, नहीं एक भी से dictके रूप में आप अपने जवाब में ग्रहण किया।
21

@a_guest अद्यतन उत्तर की जाँच करें। मैं मान नहीं रहा हूँ।
6

2

मुझे पता है कि कुछ लोग इस पार आएंगे और पाएंगे कि यहां कुछ भी मदद नहीं करता है। ऐसा करने का सबसे आसान तरीका है:

dict_count = len(dict_list)
df = pd.DataFrame(dict_list[0], index=[0])
for i in range(1,dict_count-1):
    df = df.append(dict_list[i], ignore_index=True)

आशा है कि यह किसी की मदद करता है!


1
list=[{'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'}]

और सरल कॉल:

pd=DataFrame.from_dict(list, orient='columns', dtype=None)

print(pd)

0

पायथन 3: पहले से सूचीबद्ध अधिकांश समाधान काम करते हैं। हालाँकि, ऐसे उदाहरण हैं जब डेटाफ़्रेम की पंक्ति_नंबर की आवश्यकता नहीं होती है और प्रत्येक पंक्ति (रिकॉर्ड) को व्यक्तिगत रूप से लिखना पड़ता है।

निम्नलिखित विधि उस मामले में उपयोगी है।

import csv

my file= 'C:\Users\John\Desktop\export_dataframe.csv'

records_to_save = data2 #used as in the thread. 


colnames = list[records_to_save[0].keys()] 
# remember colnames is a list of all keys. All values are written corresponding
# to the keys and "None" is specified in case of missing value 

with open(myfile, 'w', newline="",encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(colnames)
    for d in records_to_save:
        writer.writerow([d.get(r, "None") for r in colnames])

0

एक पांडा डेटाफ़्रेम के शब्दकोशों की सूची परिवर्तित करने के लिए, आप "परिशिष्ट" का उपयोग कर सकते हैं:

हम एक शब्दकोश बुलाया dicऔर डीआईसी 30 सूची आइटम है ( list1, list2, ..., list30)

  1. चरण 1: अपने परिणाम रखने के लिए एक चर को परिभाषित (पूर्व: total_df)
  2. चरण 2: total_dfसाथ आरंभ करेंlist1
  3. चरण 3: सभी सूचियों को जोड़ने के लिए "लूप के लिए" का उपयोग करें total_df
total_df=list1
nums=Series(np.arange(start=2, stop=31))
for num in nums:
    total_df=total_df.append(dic['list'+str(num)])

से अधिक के बारे में अपनी विस्तृत दो वर्षीय जवाब में @ cs95 द्वारा उल्लिखित दृष्टिकोण इस दृष्टिकोण को लाभ क्या है DataFrame(), DataFrame.from_records()है, और .from_dict()?
जेरेमी कैनी

मैंने एक शब्दकोश के लिए उपरोक्त सभी विधियों का परीक्षण किया जिसमें 30 सूचियां हैं, मुझे केवल अपेंड फ़ंक्शन का उपयोग करके उत्तर मिला।
अर्मिन अहमदी नसाब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.