2014-04-16 9 views
25

मेरे पास n -by- m पांडस डेटाफ्रेम df निम्नानुसार परिभाषित किया गया है। (मुझे पता है कि यह करने का सबसे अच्छा तरीका नहीं है। यह मेरे वास्तविक कोड में जो करने की कोशिश कर रहा है, उसके लिए यह समझ में आता है, लेकिन यह इस पोस्ट के लिए टीएमआई होगा इसलिए मेरा शब्द लें कि यह दृष्टिकोण मेरे विशेष परिदृश्य में काम करता है ।)पांडस डेटाफ्रेम संग्रहित सूची स्ट्रिंग के रूप में: सूची में वापस कैसे परिवर्तित करें?

>>> df = DataFrame(columns=['col1']) 
>>> df.append(Series([None]), ignore_index=True) 
>>> df 
Empty DataFrame 
Columns: [col1] 
Index: [] 

मैं इस प्रकार इस DataFrame की कोशिकाओं में सूचियों संग्रहीत।

>>> df['column1'][0] = [1.23, 2.34] 
>>> df 
    col1 
0 [1, 2] 

किसी कारण से, DataFrame एक सूची के बजाय एक स्ट्रिंग के रूप में इस सूची संग्रहीत।

>>> df['column1'][0] 
'[1.23, 2.34]' 

मेरे पास आपके लिए 2 प्रश्न हैं।

  1. डेटाफ्रेम एक स्ट्रिंग के रूप में एक सूची क्यों संग्रहीत करता है और क्या इस व्यवहार के आसपास कोई रास्ता है?
  2. यदि नहीं, तो क्या इस स्ट्रिंग को सूची में बदलने के लिए एक पाइथोनिक तरीका है?

अद्यतन

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

+0

क्या आप कुछ कोड पोस्ट कर सकते हैं जो इसे किसी भी arbritrary ऑब्जेक्ट को संग्रहीत करने के लिए डेटाफ्रेम समर्थन के रूप में पुन: उत्पन्न करता है, इसलिए इसे काम करना चाहिए था। – EdChum

+0

@EdChum, निश्चित बात है। –

+0

मेरे पास पांडा संस्करण '0.12.0' है, और यह सूची को स्ट्रिंग में परिवर्तित नहीं करता है। .. – namit

उत्तर

24

जैसा कि आपने बताया है, यह आमतौर पर तब हो सकता है जब पांडा डेटाफ्रेम को .csv फ़ाइलों को सहेजने और लोड करने पर टेक्स्ट टेक्स्ट प्रारूप होता है।

आपके मामले में ऐसा इसलिए हुआ क्योंकि सूची ऑब्जेक्ट्स में एक स्ट्रिंग प्रस्तुति है, जिससे उन्हें .csv फ़ाइलों के रूप में संग्रहीत किया जा सकता है। .csv लोड हो रहा है तो उस स्ट्रिंग प्रतिनिधित्व उत्पन्न करेगा।

यदि आप वास्तविक वस्तुओं को स्टोर करना चाहते हैं, तो आपको DataFrame.to_pickle() (नोट: ऑब्जेक्ट्स पिकलेबल होना चाहिए!) का उपयोग करना चाहिए।

अपने दूसरे सवाल का जवाब करने के लिए, आप इसे ast.literal_eval के साथ वापस परिवर्तित कर सकते हैं:

>>> from ast import literal_eval 
>>> literal_eval('[1.23, 2.34]') 
[1.23, 2.34] 
+1

पांडा dataframes समर्थन किसी भी arbritrary वस्तुओं के भंडारण तो यह – EdChum

+0

@EdChum काम किया है चाहिए जाहिर है नहीं, क्योंकि मैं 'मिला list'' संस्करण 0.17.1 में 'from_csv' के बाद to_csv' साथ' स्ट्रिंग' में बदला। –

1

संदर्भ के लिए केवल ... पांडा स्ट्रिंग में सूचियों पूरे नहीं करेंगे। ..

In [29]: data2 = [{'a': [1, 5], 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]                       

In [30]: df = pd.DataFrame(data2)                               

In [31]: df                                     
Out[31]: 
     a b c 
0 [1, 5] 2 NaN 
1  5 10 20 

In [32]: df['a'][0], type(df['a'][0])                              
Out[32]: ([1, 5], list) 

In [33]: pd.__version__ 
Out[33]: '0.12.0' 
+2

जैसा कि मैंने पाया है, ** कभी-कभी ** पांडा एक सूची को एक स्ट्रिंग में परिवर्तित करता है। इसे इस डेटाफ्रेम को परिभाषित करने या उसमें डेटा डालने के तरीके से करना होगा। भविष्य के संदर्भ के लिए जानना अच्छा है। –

+0

मैं पुन: बना सकते नहीं इस मुद्दे – user1827356

+0

@ user1827356, मैं यह पता लगा! मैं अब अपना प्रश्न संपादित करने जा रहा हूं। –

0

मुझे एक ही समस्या थी। Df.to_csv() का उपयोग कर एक CSV फ़ाइल में डेटाफ्रेम सूची कॉलम संग्रहीत करते समय, सूची कॉलम को स्ट्रिंग में परिवर्तित कर दिया जाता है उदा। "[42, 42, 42] के बजाय [42, 42, 42]

एलेक्स उत्तर सही है और आप स्ट्रिंग को वापस सूची में बदलने के लिए literal_eval का उपयोग कर सकते हैं। इस दृष्टिकोण के साथ समस्या यह है कि आपको एक अतिरिक्त लाइब्रेरी आयात करने की आवश्यकता है और आपको अपने डेटाफ्रेम पर फ़ंक्शन को लागू या मानचित्र करने की आवश्यकता है।आसान तरीका एक अजगर वस्तु (dtype) के रूप में स्तंभ को पढ़ने के लिए मजबूर करने के लिए पांडा

df["col1"].astype('O')

है हे सूचियों सहित पायथन वस्तुओं के लिए प्रयोग किया जाता है। अधिक जानकारी here। कृपया ध्यान दें कि इस विधि में विफल रहता है अगर तुम खाली सूची तार पार्स: "[]"

वैकल्पिक रूप से आप भी एक समारोह अपने स्तंभ के लिए आवेदन कर सकते हैं (यह एक पूर्णांक के लिए है):

def stringToList(string): 
    # input format : "[42, 42, 42]" , note the spaces after the commas, in this case I have a list of integers 
    string = string[1:len(string)-1] 
    try: 
     if len(string) != 0: 
      tempList = string.split(", ") 
      newList = list(map(lambda x: int(x), tempList)) 
     else: 
      newList = [] 
    except: 
     newList = [-9999] 
    return(newList) 

df["col1"] = df["col1"].apply(lambda x: stringToList(x)) 
1

मैं बस में आए इस समस्या को और वहाँ एक बहुत ही सरल समाधान (pandas.eval()) है। मैं पांडा 0.20.0 का उपयोग कर रहा हूँ।

# SETUP 
import pandas as pd 
import io 

csv = io.StringIO(u''' 
id list 
A1 [1,2] 
A2 [3,4] 
A3 [5,6] 
''') 

df = pd.read_csv(csv, delim_whitespace = True) 

# TYPE CHECK <type 'str'> 
print type(df.at[0, 'list']) 

# MAIN CONVERSION 
df['list'] = pd.eval(df['list']) 

# TYPE CHECK <type 'list'> 
print type(df.at[0, 'list']) 
संबंधित मुद्दे