2012-11-26 11 views
35

मान लीजिए मैं एक नेस्टेड शब्दकोश 'user_dict' संरचना के साथ है:निर्माण पांडा DataFrame

स्तर 1: प्रयोक्ता-आईडी (लांग पूर्णांक)

स्तर 2: श्रेणी (स्ट्रिंग)

स्तर 3: मिश्रित गुण (तैरता है, ints, आदि ..)

उदाहरण के लिए, इस शब्दकोश का एक प्रवेश होगा:

user_dict[12] = { 
    "Category 1": {"att_1": 1, 
        "att_2": "whatever"}, 
    "Category 2": {"att_1": 23, 
        "att_2": "another"}} 

"user_dict" में प्रत्येक आइटम एक ही संरचना है और "user_dict" आइटम जो मैं एक पांडा DataFrame को खिलाने के लिए चाहते हैं की एक बड़ी संख्या में शामिल है, से श्रृंखला का निर्माण जिम्मेदार बताते हैं। इस मामले में एक पदानुक्रम सूचकांक उद्देश्य के लिए उपयोगी होगा।

विशेष रूप से, मेरा प्रश्न यह है कि क्या डेटाफ्रेम निर्माता को यह समझने का कोई तरीका मौजूद है कि श्रृंखला को शब्दकोश में "स्तर 3" के मानों से बनाया जाना चाहिए? "स्तर 1" (प्रयोक्ता आईडी के) में

df = pandas.DataFrame(users_summary) 

आइटम जो मैं क्या हासिल करना (प्रयोक्ता आईडी सूचकांक के रूप में की है चाहते हैं के विपरीत है, स्तंभों के रूप में लिया जाता है:

अगर मैं की तरह कुछ कोशिश)।

मुझे पता है कि मैं शब्दकोश प्रविष्टियों को फिर से शुरू करने के बाद श्रृंखला का निर्माण कर सकता हूं, लेकिन अगर कोई प्रत्यक्ष तरीका है तो यह बहुत उपयोगी होगा। एक समान सवाल यह पूछेगा कि फाइल में सूचीबद्ध जेसन ऑब्जेक्ट्स से पांडा डेटाफ्रेम बनाना संभव है या नहीं।

उत्तर

51

एक पांडा मल्टीइंडेक्स में टुपल्स की एक सूची होती है। तो सबसे प्राकृतिक दृष्टिकोण आपके इनपुट dict को दोबारा बदलना होगा ताकि उसकी चाबियाँ आपको आवश्यक बहु-सूचकांक मानों के अनुरूप टुपल हों। तो फिर तुम सिर्फ अपने dataframe pd.DataFrame.from_dict का उपयोग कर निर्माण कर सकते हैं, विकल्प orient='index' का उपयोग कर:

user_dict = {12: {'Category 1': {'att_1': 1, 'att_2': 'whatever'}, 
        'Category 2': {'att_1': 23, 'att_2': 'another'}}, 
      15: {'Category 1': {'att_1': 10, 'att_2': 'foo'}, 
        'Category 2': {'att_1': 30, 'att_2': 'bar'}}} 

pd.DataFrame.from_dict({(i,j): user_dict[i][j] 
          for i in user_dict.keys() 
          for j in user_dict[i].keys()}, 
         orient='index') 


       att_1  att_2 
12 Category 1  1 whatever 
    Category 2  23 another 
15 Category 1  10  foo 
    Category 2  30  bar 

एक वैकल्पिक दृष्टिकोण घटक dataframes श्रृंखलाबद्ध करके अपने dataframe का निर्माण करने के होगा:

user_ids = [] 
frames = [] 

for user_id, d in user_dict.iteritems(): 
    user_ids.append(user_id) 
    frames.append(pd.DataFrame.from_dict(d, orient='index')) 

pd.concat(frames, keys=user_ids) 

       att_1  att_2 
12 Category 1  1 whatever 
    Category 2  23 another 
15 Category 1  10  foo 
    Category 2  30  bar 
+1

क्या मनमाने ढंग से गहराई वाली गड़बड़ी सूचियों के साथ काम करने के लिए इसे सामान्य करने का कोई उचित तरीका है? जैसे एक मनमानी गहराई के लिए सूचियां, जहां कुछ शाखाएं दूसरों की तुलना में कम हो सकती हैं, और जब कोई छोटी शाखाएं अंत तक नहीं पहुंचती हैं तो कोई भी या नन का उपयोग नहीं किया जाता है? – naught101

+3

क्या आपने पांडा जेसन समर्थन (आईओ टूल्स) और सामान्यीकरण देखा है? http://pandas.pydata.org/pandas-docs/dev/io.html#normalization –

+0

मेरी जान बचाएं !!!!!!!!!! बहुत कुछ सीखो !! धन्यवाद – Wen

10

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

import pandas as pd 
d 
{'RAY Index': {datetime.date(2014, 11, 3): {'PX_LAST': 1199.46, 
'PX_OPEN': 1200.14}, 
datetime.date(2014, 11, 4): {'PX_LAST': 1195.323, 'PX_OPEN': 1197.69}, 
datetime.date(2014, 11, 5): {'PX_LAST': 1200.936, 'PX_OPEN': 1195.32}, 
datetime.date(2014, 11, 6): {'PX_LAST': 1206.061, 'PX_OPEN': 1200.62}}, 
'SPX Index': {datetime.date(2014, 11, 3): {'PX_LAST': 2017.81, 
'PX_OPEN': 2018.21}, 
datetime.date(2014, 11, 4): {'PX_LAST': 2012.1, 'PX_OPEN': 2015.81}, 
datetime.date(2014, 11, 5): {'PX_LAST': 2023.57, 'PX_OPEN': 2015.29}, 
datetime.date(2014, 11, 6): {'PX_LAST': 2031.21, 'PX_OPEN': 2023.33}}} 

एक शब्दकोश घ आदेश है कहो

pd.Panel(d) 
<class 'pandas.core.panel.Panel'> 
Dimensions: 2 (items) x 2 (major_axis) x 4 (minor_axis) 
Items axis: RAY Index to SPX Index 
Major_axis axis: PX_LAST to PX_OPEN 
Minor_axis axis: 2014-11-03 to 2014-11-06 

जहां pd.Panel (घ) [आइटम] एक dataframe

pd.Panel(d)['SPX Index'] 
2014-11-03 2014-11-04 2014-11-05 2014-11-06 
PX_LAST 2017.81 2012.10 2023.57 2031.21 
PX_OPEN 2018.21 2015.81 2015.29 2023.33 

फिर आप आदेश to_frame हिट कर सकते हैं पैदावार() इसे डेटाफ्रेम में बदलने के लिए। मैं रीसेट_इंडेक्स का उपयोग करता हूं और प्रमुख और मामूली अक्ष को कॉलम में बदलने के बजाए उन्हें इंडेक्स के रूप में बदलता हूं।

pd.Panel(d).to_frame().reset_index() 
major minor  RAY Index SPX Index 
PX_LAST 2014-11-03 1199.460 2017.81 
PX_LAST 2014-11-04 1195.323 2012.10 
PX_LAST 2014-11-05 1200.936 2023.57 
PX_LAST 2014-11-06 1206.061 2031.21 
PX_OPEN 2014-11-03 1200.140 2018.21 
PX_OPEN 2014-11-04 1197.690 2015.81 
PX_OPEN 2014-11-05 1195.320 2015.29 
PX_OPEN 2014-11-06 1200.620 2023.33 

अंत में, यदि आप (वैसे फ्रेम आप पैनल के पक्षांतरित फ़ंक्शन का उपयोग to_frame कॉल करने से पहले स्वरूप बदलने के लिए कर सकते हैं लग रहा है पसंद नहीं है) यहाँ प्रलेखन http://pandas.pydata.org/pandas-docs/dev/generated/pandas.Panel.transpose.html

देख बस एक उदाहरण के रूप

pd.Panel(d).transpose(2,0,1).to_frame().reset_index() 
major  minor 2014-11-03 2014-11-04 2014-11-05 2014-11-06 
RAY Index PX_LAST 1199.46 1195.323  1200.936 1206.061 
RAY Index PX_OPEN 1200.14 1197.690  1195.320 1200.620 
SPX Index PX_LAST 2017.81 2012.100  2023.570 2031.210 
SPX Index PX_OPEN 2018.21 2015.810  2015.290 2023.330 

उम्मीद है कि इससे मदद मिलती है।

+0

इस तरह के एक सुरुचिपूर्ण समाधान! – vk1011

+0

यह समझना आसान था। धन्यवाद। – Moondra