पंडों के डेटाफ़्रेम को चर में मानों से बनाना “ValueError: यदि सभी स्केलर मानों का उपयोग कर रहा है, तो आपको एक इंडेक्स पास करना होगा”


369

यह एक सरल प्रश्न हो सकता है, लेकिन मैं यह नहीं पता लगा सकता कि यह कैसे करना है। चलो कहते हैं कि मेरे पास दो चर हैं जो निम्नानुसार हैं।

a = 2
b = 3

मैं इससे एक DataFrame बनाना चाहता हूं:

df2 = pd.DataFrame({'A':a,'B':b})

यह एक त्रुटि उत्पन्न करता है:

ValueError: यदि सभी स्केलर मानों का उपयोग कर रहे हैं, तो आपको एक इंडेक्स पास करना होगा

मैंने यह भी कोशिश की:

df2 = (pd.DataFrame({'a':a,'b':b})).reset_index()

यह एक ही त्रुटि संदेश देता है।

जवाबों:


569

त्रुटि संदेश कहता है कि यदि आप स्केलर मान पास कर रहे हैं, तो आपको एक इंडेक्स पास करना होगा। तो आप स्तंभों के लिए स्केलर मानों का उपयोग नहीं कर सकते हैं - उदाहरण के लिए एक सूची का उपयोग करें:

>>> df = pd.DataFrame({'A': [a], 'B': [b]})
>>> df
   A  B
0  2  3

या अदिश मानों का उपयोग करें और एक सूचकांक पास करें:

>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
   A  B
0  2  3

7
शायद यह इसलिए है क्योंकि पायथन में एक सूची में वस्तुओं का क्रम लगातार बना हुआ है, जबकि एक शब्दकोश में वस्तुओं का क्रम नहीं है। आप एक खाली शब्दकोश के साथ एक DataFrame त्वरित कर सकते हैं। सिद्धांत रूप में, मुझे लगता है कि एक एकल-पंक्ति DataFrame जैसा कि यहां दिखाया गया है, एक शब्दकोश से बनाना भी ठीक होगा क्योंकि आदेश कोई फर्क नहीं पड़ता (लेकिन इसे लागू नहीं किया गया है)। हालाँकि कई पंक्तियों के साथ, पांडस एक DataFrame बनाने में सक्षम नहीं होंगे क्योंकि यह नहीं पता होगा कि कौन सी वस्तुएँ एक ही पंक्ति की थीं।
अलेक्जेंडर

2
@VitalyIsaev - उस स्थिति में, डेटाफ्रेम पंक्ति (दिए गए शब्दकोश द्वारा दर्शाई गई) का कोई सूचकांक नहीं है (एक निहित भी नहीं है)। एक सरल समाधान एक सूची के भीतर शब्दकोश को लपेटना है, जिसमें "प्राकृतिक अनुक्रमण" है। कोई दावा कर सकता है कि यदि केवल एक डिक्शनरी दी गई है (एक रैपिंग सूची के बिना), तो मान लें index=0, लेकिन इससे आकस्मिक दुरुपयोग हो सकता है (यह सोचकर कि एक शब्दकोश किसी तरह एक बहु-पंक्ति डेटाफ़्रेम बना सकता है)
Ori

इस लिंक में कई समाधान eulertech.wordpress.com/2017/11/28/…
जेसन गोल

इसका कारण यह है क्योंकि DataFrames दो आयामी डेटा (यानी ओपी के दो चर की पंक्तियों) को धारण करने के लिए है। यदि आप केवल इंडेक्स -> वैल्यू पेयर (एक डिक्शनरी की तरह) को पकड़ना चाहते हैं, तो आपको एक श्रृंखला का उपयोग करना चाहिए, जैसा कि रॉब सुझाव देता है।
danuker

यह एक एकल नमूना / पंक्ति डेटाफ्रेम है, इसलिए सूचकांक = [0] तार्किक अर्थ बनाता है; लेकिन आप इसे इंडेक्स = [100] होने के लिए जोड़ तोड़ भी कर सकते हैं, जो काम करता है। प्रश्न: क्या सूचकांक को तार्किक रूप से वृद्धिशील रूप से आदेशित नहीं किया जाता है, क्यों अजगर सूचकांक में हेरफेर की अनुमति देता है?
सुमंत लाजर

65

आप तब भी उपयोग कर सकते हैं pd.DataFrame.from_recordsजब आपके पास पहले से ही शब्द हाथ में हो, जो अधिक सुविधाजनक हो:

df = pd.DataFrame.from_records([{ 'A':a,'B':b }])

आप इंडेक्स भी सेट कर सकते हैं, यदि आप चाहें, तो:

df = pd.DataFrame.from_records([{ 'A':a,'B':b }], index='A')

27
यह उत्तर मेरे लिए काम नहीं करता है - मुझे एक ही त्रुटि संदेश प्राप्त होता है जब from_records का उपयोग किया जाता है।
डेव किल्पिंस्की

डेव, क्या आपने कोड का टुकड़ा (निश्चित रूप से ए और बी परिभाषित करें) की कोशिश की थी? क्या आपको अभी भी त्रुटि संदेश मिलता है? क्या आप पोस्ट कर सकते हैं?
fAX

12
@DaveKielpinski क्या आप कोष्ठक जोड़ना भूल गए?
डेनिस

यह स्तंभ नाम के रूप में तानाशाह की कुंजियों का उपयोग करेगा। इंडेक्स की कुंजी कैसे सेट करें?
मिंगचौ

@DaveKielpinski कृपया, जांचें कि क्या आपने "from_records" विधि के लिए एक सूची पारित की है ; अन्यथा यह काम नहीं करेगा, और जब आप डिक्शनरी पर डेटाफ़्रेम को कॉल करेंगे तो आपको वही त्रुटि संदेश मिलेगा।
मयेरन

55

आपको पहले एक पांडा श्रृंखला बनाने की आवश्यकता है। दूसरा चरण पांडा श्रृंखला को पांडा डेटाफ्रेम में बदलना है।

import pandas as pd
data = {'a': 1, 'b': 2}
pd.Series(data).to_frame()

आप एक कॉलम नाम भी प्रदान कर सकते हैं।

pd.Series(data).to_frame('ColumnName')

1
इसने मेरे लिए काम किया। मेरे शब्दकोश में पूर्णांक कुंजियाँ और ndarray मान थे।
स्टैटसॉरसस

pd.Series(data).to_frame('ColumnName')कम है, हालांकि यह समकक्ष शायद अधिक प्रत्यक्ष है:pd.DataFrame.from_dict(data, orient='index', columns=['ColumnName'])
एलेक्स एफ

29

आप सूची में अपने शब्दकोश को लपेटने का प्रयास कर सकते हैं

my_dict = {'A':1,'B':2}

pd.DataFrame([my_dict])

   A  B
0  1  2

8

हो सकता है कि श्रृंखला आपके लिए आवश्यक सभी कार्य प्रदान करेगी:

pd.Series({'A':a,'B':b})

DataFrame को श्रृंखला के संग्रह के रूप में सोचा जा सकता है इसलिए आप कर सकते हैं:

  • एक डेटा फ्रेम में कई श्रृंखला को संरेखित करें (जैसा कि यहां वर्णित है )

  • मौजूदा डेटा फ़्रेम में एक श्रृंखला चर जोड़ें ( उदाहरण के लिए )


7

आपको पांडस डेटाफ़्रेम कॉलम के मान के रूप में पुनरावृत्तियाँ प्रदान करने की आवश्यकता है:

df2 = pd.DataFrame({'A':[a],'B':[b]})

6

मुझे स्तब्ध सरणियों के साथ एक ही समस्या थी और समाधान उन्हें समतल करना है:

data = {
    'b': array1.flatten(),
    'a': array2.flatten(),
}

df = pd.DataFrame(data)

3

यदि आप स्केलर का शब्दकोश बदलने का इरादा रखते हैं, तो आपको एक सूचकांक शामिल करना होगा:

import pandas as pd

alphabets = {'A': 'a', 'B': 'b'}
index = [0]
alphabets_df = pd.DataFrame(alphabets, index=index)
print(alphabets_df)

हालाँकि सूचियों के शब्दकोश के लिए सूचकांक की आवश्यकता नहीं है, फिर भी समान विचारों को सूचियों के शब्दकोश में विस्तारित किया जा सकता है:

planets = {'planet': ['earth', 'mars', 'jupiter'], 'length_of_day': ['1', '1.03', '0.414']}
index = [0, 1, 2]
planets_df = pd.DataFrame(planets, index=index)
print(planets_df)

बेशक, सूचियों के शब्दकोश के लिए, आप एक सूचकांक के बिना डेटाफ्रेम का निर्माण कर सकते हैं:

planets_df = pd.DataFrame(planets)
print(planets_df)

3

तुम कोशिश कर सकते हो:

df2 = pd.DataFrame.from_dict({'a':a,'b':b}, orient = 'index')

'ओरिएंट' तर्क पर प्रलेखन से: यदि पारित की गई कुंजियों की चाबियाँ परिणामी DataFrame के कॉलम होनी चाहिए, तो 'कॉलम' (डिफ़ॉल्ट) पास करें। अन्यथा यदि कुंजियाँ पंक्तियाँ होनी चाहिए, तो 'इंडेक्स' पास करें।


कृपया अपने प्रश्न / उत्तर को ठीक से संपादित करने और प्रारूपित करने के लिए फ़ॉर्मेटिंग टूल का उपयोग करें। वाक्यों के भीतर कोड code को बोल्ड होने के लिए बहुत महत्वपूर्ण शब्द के रूप में स्वरूपित किया जाना चाहिए , कम महत्वपूर्ण प्याज इटैलिक इसके अलावा यदि आवश्यक हो तो सूचियों का उपयोग करें
मोर्स

यह पूछे गए प्रश्न को हल नहीं करता है, यह वांछित से अलग परिणाम पैदा करता है।
केन विलियम्स

3

काम पर पंडों का जादू। सब तर्क बाहर है।

त्रुटि संदेश "ValueError: If using all scalar values, you must pass an index"कहता है कि आपको एक इंडेक्स पास करना होगा।

यह जरूरी नहीं है कि एक इंडेक्स पास करने से पांडा को वह काम करना चाहिए जो आप करना चाहते हैं

जब आप एक इंडेक्स पास करते हैं, तो पंडास आपकी डिक्शनरी कीज़ को कॉलम के नाम और वैल्यूज़ के रूप में मानेंगे।

a = 2
b = 3
df2 = pd.DataFrame({'A':a,'B':b}, index=[1])

    A   B
1   2   3

एक बड़ा सूचकांक पास करना:

df2 = pd.DataFrame({'A':a,'B':b}, index=[1, 2, 3, 4])

    A   B
1   2   3
2   2   3
3   2   3
4   2   3

एक इंडेक्स आमतौर पर डेटाफ़्रेम द्वारा उत्पन्न होता है जब कोई नहीं दिया जाता है। हालांकि, पांडा के कितने पंक्तियों पता नहीं है 2और 3आप चाहते हैं। हालाँकि आप इसके बारे में अधिक स्पष्ट हो सकते हैं

df2 = pd.DataFrame({'A':[a]*4,'B':[b]*4})
df2

    A   B
0   2   3
1   2   3
2   2   3
3   2   3

डिफ़ॉल्ट इंडेक्स हालांकि 0 आधारित है।

मैं डेटाफ़्रेम बनाने के लिए हमेशा डेटाफ़्रेम कंस्ट्रक्टर को सूचियों का एक शब्दकोश पारित करने की सलाह दूंगा। अन्य डेवलपर्स के लिए पढ़ना आसान है। पंडों के पास बहुत सारे करवटें हैं, अन्य डेवलपर्स को उन सभी में विशेषज्ञों के लिए मत बनो, ताकि वे आपके कोड को पढ़ सकें।


3

इनपुट में रिकॉर्ड की एक सूची होना जरूरी नहीं है - यह एक एकल शब्दकोश भी हो सकता है:

pd.DataFrame.from_records({'a':1,'b':2}, index=[0])
   a  b
0  1  2

जो इसके बराबर प्रतीत होता है:

pd.DataFrame({'a':1,'b':2}, index=[0])
   a  b
0  1  2

2

ऐसा इसलिए है क्योंकि एक DataFrame में दो सहज आयाम हैं - कॉलम और पंक्तियाँ।

आप केवल शब्दकोश कुंजियों का उपयोग करके कॉलम निर्दिष्ट कर रहे हैं।

यदि आप केवल एक आयामी डेटा निर्दिष्ट करना चाहते हैं, तो एक श्रृंखला का उपयोग करें!


0

शब्दकोश को डेटा फ्रेम में बदलें

col_dict_df = pd.Series(col_dict).to_frame('new_col').reset_index()

कॉलम को नया नाम दें

col_dict_df.columns = ['col1', 'col2']

-2

यदि आपके पास एक शब्दकोष है, तो आप इसे कोड की निम्नलिखित पंक्ति के साथ पांडा डेटा फ्रेम में बदल सकते हैं:

pd.DataFrame({"key": d.keys(), "value": d.values()})

यह काम करता है, लेकिन IMHO यह बहुत मायने नहीं रखता है <code> `<! - भाषा: lang-py -> फल_count = defaultdict (int) fruit_count [" सेब "] = 10 फल_काउंट [केले]] = 21 pd.DataFrame ({"key": fruit_count.keys (), "value": फल_count.values ​​()}) बाहर: कुंजी मान 0 (केले, सेब) (21, 10) 1 (केले, सेब) (21) 10) <कोड>
एमिटर

-3

बस सूची पर डिक्टेट पास करें:

a = 2
b = 3
df2 = pd.DataFrame([{'A':a,'B':b}])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.