अजगर को एक डेटाफ्रेम में परिवर्तित करें


298

मेरे पास निम्नलिखित की तरह एक पायथन डिक्शनरी है:

{u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 u'2012-06-13': 389,
 u'2012-06-14': 389,
 u'2012-06-15': 389,
 u'2012-06-16': 389,
 u'2012-06-17': 389,
 u'2012-06-18': 390,
 u'2012-06-19': 390,
 u'2012-06-20': 390,
 u'2012-06-21': 390,
 u'2012-06-22': 390,
 u'2012-06-23': 390,
 u'2012-06-24': 390,
 u'2012-06-25': 391,
 u'2012-06-26': 391,
 u'2012-06-27': 391,
 u'2012-06-28': 391,
 u'2012-06-29': 391,
 u'2012-06-30': 391,
 u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

चाबियाँ यूनिकोड तिथियां हैं और मान पूर्णांक हैं। मैं इसे पंडों के डेटाफ़्रेम में दिनांक और उनके संबंधित मानों को दो अलग-अलग स्तंभों के रूप में परिवर्तित करना चाहूंगा। उदाहरण: col1: तिथियाँ col2: DateValue (तिथियां अभी भी यूनिकोड हैं और दिनांक अभी भी पूर्णांक हैं)

     Date         DateValue
0    2012-07-01    391
1    2012-07-02    392
2    2012-07-03    392
.    2012-07-04    392
.    ...           ...
.    ...           ...

इस दिशा में किसी भी मदद की बहुत सराहना की जाएगी। मुझे इसकी सहायता के लिए पांडा डॉक्स पर संसाधन नहीं मिल पा रहे हैं।

मुझे पता है कि एक समाधान इस प्रमुख-मूल्य जोड़ी को एक तानाशाह में परिवर्तित करने के लिए हो सकता है, ताकि पूरी संरचना एक तरह से डाइक बन जाए, और फिर हम प्रत्येक पंक्ति को व्यक्तिगत रूप से डेटाफ़्रेम में जोड़ सकते हैं। लेकिन मैं यह जानना चाहता हूं कि क्या ऐसा करने का एक आसान तरीका और अधिक प्रत्यक्ष तरीका है।

अब तक मैंने कोशिश की है कि श्रंखला को एक ऑब्जेक्ट में परिवर्तित किया जाए, लेकिन यह स्तंभों के बीच संबंध बनाए रखने के लिए नहीं लगता है:

s  = Series(my_dict,index=my_dict.keys())

मैंने श्रंखला के रूप में तारीखों के साथ श्रंखला को ऑब्जेक्ट में बदलने की कोशिश की है, लेकिन यह किसी कारण से संबंधित मूल्यों के साथ तारीखों से मेल नहीं खाता।
अन्नूसर ०४२0

कोड पोस्ट किया गया है। मैं पूछताछ करना चाहता हूं कि क्या बिना डिक्टेट के एक डेटाफ्रेम तैयार करने का एक तरीका है और फिर प्रत्येक पंक्ति को अलग से जोड़ना है।
अन्नूसर ०४२0

1
एक "यूनिकोड तिथि" क्या है? क्या आपका मतलब आईएसओ 8601 तारीख है?
पीटर मोर्टेंसन

जवाबों:


460

यहाँ त्रुटि है, जब से डेटाफ़ॉर्म कंस्ट्रक्टर को स्केलर मानों के साथ कॉल किया जाता है (जहाँ यह मान देता है कि सूची / तानाशाह / ... यानी कई कॉलम हैं):

pd.DataFrame(d)
ValueError: If using all scalar values, you must must pass an index

आप शब्दकोष से आइटम ले सकते हैं (यानी कुंजी-मूल्य जोड़े):

In [11]: pd.DataFrame(d.items())  # or list(d.items()) in python 3
Out[11]:
             0    1
0   2012-07-02  392
1   2012-07-06  392
2   2012-06-29  391
3   2012-06-28  391
...

In [12]: pd.DataFrame(d.items(), columns=['Date', 'DateValue'])
Out[12]:
          Date  DateValue
0   2012-07-02        392
1   2012-07-06        392
2   2012-06-29        391

लेकिन मुझे लगता है कि श्रृंखला निर्माता को पारित करने के लिए यह अधिक समझ में आता है:

In [21]: s = pd.Series(d, name='DateValue')
Out[21]:
2012-06-08    388
2012-06-09    388
2012-06-10    388

In [22]: s.index.name = 'Date'

In [23]: s.reset_index()
Out[23]:
          Date  DateValue
0   2012-06-08        388
1   2012-06-09        388
2   2012-06-10        388

4
@ user1009091 मुझे एहसास हुआ कि अब त्रुटि का क्या मतलब है, यह मूल रूप से कह रहा है "मैं जो देख रहा हूं वह एक श्रृंखला है, इसलिए श्रृंखला निर्माता का उपयोग करें"।
एंडी हेडन

1
साभार - बहुत मददगार क्या आप शायद बता सकते हैं कि इस विधि का उपयोग करने और DataFrame.from_dict () का उपयोग करने के बीच क्या अंतर है? आपकी विधि (जिसका मैंने उपयोग किया था) प्रकार = pandas.core.frame.DataFrame, जबकि अन्य रिटर्न = class 'pandas.core.frame.ata.DataFrame' टाइप करता है। कोई भी मौका आप अंतर समझा सकते हैं और जब प्रत्येक विधि उपयुक्त है? अग्रिम धन्यवाद :)
ऑप्टिमेश

वे दोनों समान हैं, from_dictएक ओरिएंट kwarg है, इसलिए मैं इसका उपयोग कर सकता हूं अगर मैं ट्रांसपोज़िंग से बचना चाहता था। from_dictहुड के तहत कुछ विकल्प हैं , यह वास्तव में DataFrame कंस्ट्रक्टर का उपयोग करने से अलग नहीं है।
एंडी हेडन

54
मैं pandas.core.common.PandasError: DataFrame constructor not properly called!पहले उदाहरण से देख रहा हूं
allthesignals

18
@allthesignals जोड़ने की सूची () d.items के आस-पास काम करती है: pd.DataFrame (सूची (d.items), कॉलम = ['दिनांक', 'DateValue'])
sigurdb 22:18

141

शब्दकोश को पंडों के डेटाफ़्रेम में परिवर्तित करते समय जहाँ आप चाहते हैं कि उक्त डेटाफ़्रेम के कॉलम हों और पंक्ति के मान हों, तो आप इस तरह से शब्दकोश के चारों ओर कोष्ठक लगा सकते हैं:

>>> dict_ = {'key 1': 'value 1', 'key 2': 'value 2', 'key 3': 'value 3'}
>>> pd.DataFrame([dict_])

    key 1     key 2     key 3
0   value 1   value 2   value 3

इसने मुझे कुछ सिरदर्द से बचाया है इसलिए मुझे आशा है कि यह किसी को वहाँ से बाहर निकालने में मदद करेगा!

EDIT: पंडों डॉक्सdata में डेटाफ़्रेम कंस्ट्रक्टर में पैरामीटर के लिए एक विकल्प शब्दकोशों की एक सूची है। यहां हम इसमें एक शब्दकोश के साथ एक सूची दे रहे हैं।


6
हां, मैंने भी ऐसा किया है, लेकिन।
एंटोन vBR

1
यह ठीक काम करता है लेकिन पता नहीं क्यों हमें इसे इस तरह करना पड़ता है।
हुइ चेन

क्या होगा अगर मैं चाहता हूं कि इन स्तंभों में से एक का उपयोग सूचकांक के रूप में किया जाए
ओम त्रिपाठी

102

जैसा कि pandas.DataFrame()सीधे यहाँ उपयोग करके दूसरे उत्तर में बताया गया है, जैसा आप सोचते हैं वैसा काम नहीं करेगा।

आप क्या कर सकते इस्तेमाल होता है pandas.DataFrame.from_dictके साथ orient='index':

In[7]: pandas.DataFrame.from_dict({u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 .....
 u'2012-07-05': 392,
 u'2012-07-06': 392}, orient='index', columns=['foo'])
Out[7]: 
            foo
2012-06-08  388
2012-06-09  388
2012-06-10  388
2012-06-11  389
2012-06-12  389
........
2012-07-05  392
2012-07-06  392

1
क्या हम इसे किसी भी renameविधि से अनुक्रमित कर सकते हैं और एक बार में सूचकांक और स्तंभों के नाम भी निर्धारित कर सकते हैं?
सिप्रियन टॉमोयागै

4
अच्छी बात। एक उदाहरण होगा: ...., ओरिएंट = 'इंडेक्स')। नाम बदलें (कॉलम = {0: 'फोब्बर'})
ntg

1
आप pandas.DataFrame.from_dict (..., ओरिएंट = 'इंडेक्स', कॉलम = ['फू', 'बार') भी निर्दिष्ट कर सकते हैं, यह ऊपर सूचीबद्ध स्रोत से है
spen.smith

अच्छा बिंदु, इस पांडा .22 जो मूल जवाब के बाद था से सच है ... मेरा उत्तर अपडेट किया गया ...
NTG

69

डेटाफ़्रेम कंस्ट्रक्टर को शब्दकोश की वस्तुओं को पास करें, और कॉलम नाम दें। उसके बाद मान Dateप्राप्त करने के लिए कॉलम को पार्स करें Timestamp

अजगर 2.x और 3.x के बीच अंतर पर ध्यान दें:

अजगर में 2.x:

df = pd.DataFrame(data.items(), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])

पायथन 3.x में: (अतिरिक्त 'सूची' की आवश्यकता)

df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])

3
यह मुझे देता है:PandasError: DataFrame constructor not properly called!
क्रिस नील्सन

18
@ChrisNielsen आप शायद python3 का उपयोग कर रहे हैं। आपको कोशिश करनी चाहिए:df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
विक्टर केर्केज़

यह बेहतर उत्तर है क्योंकि यह दर्शाता है कि अजगर 3 में क्या किया जाना चाहिए
ifly6

22

सूचियों और शब्दकोशों से डी.एफ.

पीएस विशेष रूप से, मैंने रो-ओरिएंटेड उदाहरणों को उपयोगी पाया है; चूंकि अक्सर रिकॉर्ड कैसे बाह्य रूप से संग्रहीत किए जाते हैं।

https://pbpython.com/pandas-list-dict.html


10

पंडों ने डिक्टेट को डेटा फ्रेम में बदलने के लिए बिल्ट-इन फ़ंक्शन किया है।

pd.DataFrame.from_dict (dictionaryObject, ओरिएंट = 'सूचकांक')

अपने डेटा के लिए आप इसे नीचे की तरह परिवर्तित कर सकते हैं:

import pandas as pd
your_dict={u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 u'2012-06-13': 389,
 u'2012-06-14': 389,
 u'2012-06-15': 389,
 u'2012-06-16': 389,
 u'2012-06-17': 389,
 u'2012-06-18': 390,
 u'2012-06-19': 390,
 u'2012-06-20': 390,
 u'2012-06-21': 390,
 u'2012-06-22': 390,
 u'2012-06-23': 390,
 u'2012-06-24': 390,
 u'2012-06-25': 391,
 u'2012-06-26': 391,
 u'2012-06-27': 391,
 u'2012-06-28': 391,
 u'2012-06-29': 391,
 u'2012-06-30': 391,
 u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

your_df_from_dict=pd.DataFrame.from_dict(your_dict,orient='index')
print(your_df_from_dict)

2
यह वास्तव में बुरा समाधान है, क्योंकि सूचकांक के रूप में शब्दकोश कुंजियों को बचाता है।
एक अर्थशास्त्री


5

आप नए डेटाफ्रेम में शब्दकोश की कुंजी और मान भी पास कर सकते हैं, जैसे:

import pandas as pd

myDict = {<the_dict_from_your_example>]
df = pd.DataFrame()
df['Date'] = myDict.keys()
df['DateValue'] = myDict.values()

5

मेरे मामले में मैं चाहता था कि एक तानाशाही के मान और मूल्य डेटाफ्रेम के कॉलम और मूल्य हों। तो केवल एक चीज जो मेरे लिए काम करती थी:

data = {'adjust_power': 'y', 'af_policy_r_submix_prio_adjust': '[null]', 'af_rf_info': '[null]', 'bat_ac': '3500', 'bat_capacity': '75'} 

columns = list(data.keys())
values = list(data.values())
arr_len = len(values)

pd.DataFrame(np.array(values, dtype=object).reshape(1, arr_len), columns=columns)

5

यह मेरे लिए काम किया है, क्योंकि मैं एक अलग सूचकांक कॉलम करना चाहता था

df = pd.DataFrame.from_dict(some_dict, orient="index").reset_index()
df.columns = ['A', 'B']

3

एक तानाशाही को तर्क के रूप में स्वीकार करता है और एक तानाशाह को कुंजी के रूप में सूचकांक और मानों को एक स्तंभ के रूप में देता है।

def dict_to_df(d):
    df=pd.DataFrame(d.items())
    df.set_index(0, inplace=True)
    return df

एक तानाशाही, एक डेटा फ्रेम लौटाता है
सबसे पहले

3

इस तरह से यह मेरे लिए काम किया है:

df= pd.DataFrame([d.keys(), d.values()]).T
df.columns= ['keys', 'values']  # call them whatever you like

आशा है कि ये आपकी मदद करेगा


1
d = {'Date': list(yourDict.keys()),'Date_Values': list(yourDict.values())}
df = pandas.DataFrame(data=d)

यदि आप yourDict.keys()अंदर नहीं घुसते हैं list(), तो आप अपनी सभी कुंजियों और मूल्यों को हर कॉलम की हर पंक्ति में रखेंगे। ऐशे ही:

Date \ 0 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
1 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
2 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
3 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
4 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...

लेकिन list()तब जोड़कर परिणाम इस तरह दिखता है:

Date Date_Values 0 2012-06-08 388 1 2012-06-09 388 2 2012-06-10 388 3 2012-06-11 389 4 2012-06-12 389 ...


0

मैंने इसे कई बार चलाया है और एक उदाहरण शब्दकोश है जो मैंने एक फ़ंक्शन से बनाया है get_max_Path(), और यह नमूना शब्दकोश लौटाता है:

{2: 0.3097502930247044, 3: 0.4413177909384636, 4: 0.5197224051562838, 5: 0.5717654946470984, 6: 0.6063959031223476, 7: 0.6365209824708223, 8: 0.655918861281035, 9: 0.680844386645206}

इसे डेटाफ्रेम में बदलने के लिए, मैंने निम्नलिखित कार्य किया:

df = pd.DataFrame.from_dict(get_max_path(2), orient = 'index').reset_index()

एक अलग सूचकांक के साथ एक साधारण दो कॉलम डेटाफ़्रेम लौटाता है:

index 0 0 2 0.309750 1 3 0.441318

उपयोग करने वाले कॉलम का नाम बदलें f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)


0

मुझे लगता है कि जब आप शब्दकोश बनाते हैं तो आप अपने डेटा प्रारूप में कुछ बदलाव कर सकते हैं, फिर आप इसे आसानी से डेटाफ़्रेम में बदल सकते हैं:

इनपुट:

a={'Dates':['2012-06-08','2012-06-10'],'Date_value':[388,389]}

उत्पादन:

{'Date_value': [388, 389], 'Dates': ['2012-06-08', '2012-06-10']}

इनपुट:

aframe=DataFrame(a)

आउटपुट: आपका डेटाफ़्रेम होगा

आपको बस कुछ टेक्स्ट एडिटिंग का उपयोग करने की आवश्यकता है जैसे कि Sublime या शायद Excel में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.