2017-04-20 96 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

由于性能原因,这对我来说不是很方便。这是一个非常大的文件,我转换,这遍历每个列表中的每个条目。 –

相关问题