2016-02-03 4 views
5

में मिश्रित डेटा और श्रेणी के साथ पांडा डेटाफ्रेम संग्रह करना मैं एक एचडीएफ 5 फ़ाइल में विभिन्न स्तंभों के साथ डेटा फ्रेम को स्टोर करना चाहता हूं (नीचे डेटा प्रकारों के साथ एक अंश पाएं)।एचडीएफ 5

In [1]: mydf 
Out [1]: 
endTime    uint32 
distance   float16 
signature   category 
anchorName  category 
stationList   object 

कुछ स्तंभ (ऊपर मेरी अंश में हस्ताक्षर और anchorName) परिवर्तित करने से पहले, मैं यह स्टोर करने के लिए (जो बहुत ठीक काम करता है) के बाद की तरह कोड का इस्तेमाल किया:

path = 'tmp4.hdf5' 
key = 'journeys' 
mydf.to_hdf(path, key, mode='w', complevel=9, complib='bzip2') 

लेकिन यह वर्ग के साथ काम नहीं करता है

path = 'tmp4.hdf5' 
key = 'journeys' 
mydf.to_hdf(path, key, mode='w', format='t', complevel=9, complib='bzip2') 

यह ठीक काम करता है, अगर मैं स्तंभ stationList, जहां प्रत्येक प्रविष्टि स्ट्रिंग की एक सूची है निकालें: और फिर मैं निम्नलिखित की कोशिश की। लेकिन इस कॉलम के साथ मुझे निम्नलिखित अपवाद मिला:

Cannot serialize the column [stationList] because 
its data contents are [mixed] object dtype 

डेटा फ्रेम संग्रहीत करने के लिए मुझे अपने कोड को बेहतर बनाने की आवश्यकता कैसे है?

पांडा संस्करण: 0.17.1
अजगर संस्करण:

import pandas as pd 

mydf = pd.DataFrame({'endTime' : pd.Series([1443525810,1443540836,1443609470]), 
        'distance' : pd.Series([454.75,477.25,242.12]), 
        'signature' : pd.Series(['ab','cd','ab']), 
        'anchorName' : pd.Series(['tec','ing','pol']), 
        'stationList' : pd.Series([['t1','t2','t3'],['4','t2','t3'],['t3','t2','t4']]) 
        }) 

# this works fine (no category) 
mydf.to_hdf('tmp_without_cat.hdf5', 'journeys', mode='w', complevel=9, complib='bzip2') 

for col in ['anchorName', 'signature']: 
    mydf[col] = mydf[col].astype('category') 

# this crashes now because of category data 
# mydf.to_hdf('tmp_with_cat.hdf5', 'journeys', mode='w', complevel=9, complib='bzip2') 

# switching to format='t' 
# this caused problems because of "mixed data" in column stationList 
mydf.to_hdf('tmp_with_cat.hdf5', 'journeys', mode='w', format='t', complevel=9, complib='bzip2') 

mydf.pop('stationList') 

# this again works fine 
mydf.to_hdf('tmp_with_cat_without_stationList.hdf5', 'journeys', mode='w', format='t', complevel=9, complib='bzip2') 

: 2.7.6


edit1 (कुछ नमूना कोड) (यह compability कारणों की वजह से नहीं बदल सकते हैं)

संपादित 2: इस बीच मैंने इस समस्या से छुटकारा पाने के लिए विभिन्न चीजों की कोशिश की। इनमें से एक कॉलम स्टेशन सूची की प्रविष्टियों को टुपल्स में परिवर्तित करना था (संभव है क्योंकि उन्हें बदला नहीं जाएगा) और इसे श्रेणी में भी परिवर्तित करने के लिए। लेकिन यह कुछ भी नहीं बदला। आप दो समस्याएं हैं

mydf.stationList = [tuple(x) for x in mydf.stationList.values] 
mydf.stationList.astype('category') 
+0

क्या यह एक सवाल है? यदि आप परीक्षण डेटाफ्रेम बनाने के लिए वास्तविक कोड पोस्ट करते हैं तो यह भी मदद करेगा। – Goyo

+0

यह समस्या है। मुझे अन्य फ़ाइलों से डेटा मिलता है जो कुछ अन्य स्क्रिप्ट द्वारा संग्रहीत किए जाते थे। मैं एक मूल डेटा पीढ़ी बनाने की कोशिश करूंगा जो मेरी समस्या दिखा सकता है। – AnnetteC

+0

ऐसा लगता है कि आप अब तक एक ही एचडीएफ 5 प्रारूप में दोनों श्रेणियों और सूचियों/tuples को स्टोर नहीं कर सकते हैं (यह भविष्य में तय किया जा सकता है)। मैं आपको बता नहीं सकता कि आपकी आवश्यकताओं के बारे में और जानने के बिना क्या बदला जाए। हो सकता है कि स्ट्रिंग्स स्ट्रिंग्स के रूप में छोड़ दें, शायद स्टेशन सूची आइटम के लिए एक अलग प्रतिनिधित्व चुनें ... बहुत सारे विकल्प हैं। – Goyo

उत्तर

5

: यहाँ लाइनों मैं रूपांतरण पाश (सिर्फ पूर्णता के लिए) के बाद जोड़ा हैं

  1. आप एक HDF5 फ़ाइल में स्पष्ट डाटा स्टोर करना चाहते हैं;
  2. आप एक एचडीएफ 5 फ़ाइल में मनमाने ढंग से वस्तुओं (यानी stationList) स्टोर करने की कोशिश कर रहे हैं।

जैसा कि आपने पाया, स्पष्ट डेटा (वर्तमान में?) केवल एचडीएफ 5 के लिए "टेबल" प्रारूप में समर्थित है।

हालांकि, मनमानी वस्तुओं (तारों की सूची इत्यादि) को संग्रहीत करना वास्तव में कुछ ऐसा नहीं है जो एचडीएफ 5 प्रारूप द्वारा समर्थित है। पेंडल आपके लिए अचार का उपयोग करके इन वस्तुओं को क्रमबद्ध करके, और फिर अचार-लंबाई वाली स्ट्रिंग के रूप में अचार को संग्रहीत करते हैं (जो सभी एचडीएफ 5 प्रारूपों द्वारा समर्थित नहीं है), मुझे लगता है। लेकिन यह धीमा और अक्षम होगा, और एचडीएफ 5 द्वारा कभी भी समर्थित नहीं होगा।

मेरे मन में, आप दो विकल्प हैं:

  1. अपने डेटा धुरी ताकि आप स्टेशन नाम से डेटा की एक पंक्ति है। फिर आप सबकुछ टेबल-प्रारूप एचडीएफ 5 फाइल में स्टोर कर सकते हैं। (यह सामान्य रूप से एक अच्छा अभ्यास है; Hadley Wickham on Tidy Data देखें।)
  2. यदि आप वास्तव में इस प्रारूप को रखना चाहते हैं, तो आप to_pickle() का उपयोग कर पूरे डेटाफ्रेम को भी सहेज सकते हैं। किसी भी प्रकार की वस्तु से निपटने में कोई समस्या नहीं होगी (उदा।तारों की सूची, आदि) आप इसे फेंक देते हैं।

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

+1

यह समस्या बहुत मानक है, लेकिन समाधान कम हैं – Tensor

संबंधित मुद्दे