2012-11-01 19 views
3

我有一個數據框,其中包含一個列表,其中包含列表。當我將數據框寫入文件然後重新打開它時,我最終將列表轉換爲一個字符串。有沒有辦法安全地讀/寫有列表作爲成員的數據框?list to df.to-csv()中的字符串

df1 = DataFrame({'a':[['john quincy', 'tom jones', 'jerry rice'],['bob smith','sally ride','little wayne'],['seven','eight','nine'],['ten','eleven','twelve']],'b':[9,2,4,5], 'c': [7,3,0,9]}) 

df1.to_csv('temp.csv') 
df2 = read_csv('temp.csv') 

#note how the list (df1) has been converted to a string (df2) 
df1['a'][0] 
['john quincy', 'tom jones', 'jerry rice'] 

df2['a'][0] 
"['john quincy', 'tom jones', 'jerry rice']" 
+0

在唐看完」你想要相反嗎? 'lambda L:L.split(',')' - 不再加入... –

+0

我把它表明它已經被轉換爲字符串。這只是說明情況。如果你打開臨時文件,你會看到列表中有引號。 – zach

+0

在熊貓github上提交了一個問題https://github.com/pydata/pandas/issues/2158 – zach

回答

2

無需首先將列表轉換爲字符串,列表將自動轉換爲字符串。只要寫包含列表中的數據框,並使用ast.literal_evaldf2

           a b c 
0 ['john quincy', 'tom jones', 'jerry rice'] 9 7 
1 ['bob smith', 'sally ride', 'little wayne'] 2 3 
2     ['seven', 'eight', 'nine'] 4 0 
3     ['ten', 'eleven', 'twelve'] 5 9 

df1.to_csv('temp.csv') 
df2 = read_csv('temp.csv') 

使用ast.literal_eval得到的字符串返回列表:

import ast 
fd2['a']=df2['a'].apply(lambda x: ast.literal_eval(x)) 
type(df2['a'][1]) 

輸出:

list 
+0

根,感謝您的輸入。字符串轉換部分具有誤導性。我想這樣做,作爲我的腳本的一部分,但我得到一個錯誤,因爲雖然我期望我作爲字符串返回的列表。 – zach

+0

@ zach - 我不確定我是否遵循你想要達到的目標... – root

+0

@ root。你的回答很好。爲了清楚起見,我重寫了這個問題。雖然我寧願如果大熊貓讀/寫分析器會自動識別它。 – zach

1

的問題是在這裏:

df2['a'] =df2['a'].map(f) 
        ^^^^^^ 

f = lambda x : ','.join(x)

沒有意義,再加入它,你把它分離到一個列表:

df2['a'] = df2['a'].map(lambda L: L.split(',')) 
+0

我重寫了刪除地圖函數的答案,因爲它更容易混淆而不是幫助。感謝你的回答 – zach