2017-04-20 93 views
2

我有我認爲的超級基本問題,但我無法找到解決方案。簡而言之,我在csv列中有一列是數字列表。這csvpandasto_csv生成。當試圖用read_csv重新讀取它時,它會自動將此數字列表轉換爲string將字符串列表轉換爲熊貓列表中的浮點數

當然後試圖使用它,我顯然會得到錯誤。當我嘗試使用to_numeric函數時,我也會遇到錯誤,因爲它是一個列表,而不是一個數字。

有什麼辦法解決這個問題嗎?發佈代碼下面的表格,但可能不是非常有幫助:

def write_func(dataset): 
    features = featurize_list(dataset[column]) # Returns numpy array 
    new_dataset = dataset.copy() # Don't want to modify the underlying dataframe 
    new_dataset['Text'] = features 
    new_dataset.rename(columns={'Text': 'Features'}, inplace=True) 
    write(new_dataset, dataset_name) 

def write(new_dataset, dataset_name): 
    dump_location = feature_set_location(dataset_name, self) 
    featurized_dataset.to_csv(dump_location) 

def read_func(read_location): 
    df = pd.read_csv(read_location) 
    df['Features'] = df['Features'].apply(pd.to_numeric) 

Features列是一個問題。當我嘗試目前read_func運行apply我得到這個錯誤:

ValueError: Unable to parse string "[0.019636873200000002, 0.10695576670000001,...]" at position 0 

我不能碰到這個問題的第一人,是有一些方法在讀來處理這種/寫入時間?

回答

2

您想使用literal_eval作爲converter傳遞給pd.read_csv。下面是一個如何工作的例子。

from ast import literal_eval 
form io import StringIO 
import pandas as pd 

txt = """col1|col2 
a|[1,2,3] 
b|[4,5,6]""" 

df = pd.read_csv(StringIO(txt), sep='|', converters=dict(col2=literal_eval)) 
print(df) 

    col1  col2 
0 a [1, 2, 3] 
1 b [4, 5, 6] 
+0

這種產品是否安全? 'literal_eval'勾畫了我很多,我沒有完全控制這裏的輸入文件。他們從遠程服務器上被拉下來。 –

+0

我同樣通過'eval'勾勒出來......'literal_eval'旨在通過安全解析文字來緩解恐懼。看到[***這篇文章***](http://stackoverflow.com/a/15197698/2336654) – piRSquared

+0

這似乎...可行,但這是否真的是唯一的方法嗎?對於感覺像一個非常基本的用例的東西來說,這真是太神祕了。要清楚這*做*工作。 –

0

我修改了你的最後一個函數,它工作正常。

def read_func(read_location): 
    df = pd.read_csv(read_location) 
    df['Features'] = df['Features'].apply(lambda x : pd.to_numeric(x)) 
+0

由於性能原因,這對我來說不是很方便。這是一個非常大的文件,我轉換,這遍歷每個列表中的每個條目。 –

相關問題