Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以使用矢量化代码解析包含数组的csv列?_Python_Pandas_Numpy_Csv - Fatal编程技术网

Python 是否可以使用矢量化代码解析包含数组的csv列?

Python 是否可以使用矢量化代码解析包含数组的csv列?,python,pandas,numpy,csv,Python,Pandas,Numpy,Csv,下面的代码生成一个CSV,然后再次解析它。列b包含每个字段的整数数组 import pandas as pd from io import StringIO import numpy as np # Create CSV df = pd.DataFrame(dict( a=[1,2,3], b=[[1], [1,2], [1,2,3]] )) s = df.to_csv() # ,a,b # 0,1,[1] # 1,2,"[1, 2]" # 2,3,"[1, 2, 3]"

下面的代码生成一个CSV,然后再次解析它。列b包含每个字段的整数数组

import pandas as pd
from io import StringIO
import numpy as np


# Create CSV
df = pd.DataFrame(dict(
    a=[1,2,3],
    b=[[1], [1,2], [1,2,3]]
))
s = df.to_csv()

# ,a,b
# 0,1,[1]
# 1,2,"[1, 2]"
# 2,3,"[1, 2, 3]"

def parse(s):
    return np.fromstring(s[1:-1], sep=", ", dtype=int)

df2 = pd.read_csv(StringIO(s), converters=dict(b=parse))
现在的问题是,是否可以矢量化/加速解析。我怀疑通过为b列指定一个数据类型可能实现这一点,但我无法确定这将是什么数据类型


有什么建议吗?

这个转换器工作正常吗?那么我建议坚持下去

原始DF有一个object-dtype列,其中包含大小不同的列表。save写入这些列表的
str
版本。转换生成一个数组

In [155]: np.fromstring("[1,2,3]"[1:-1], sep=", ", dtype=int)                                  
Out[155]: array([1, 2, 3])
eval
(或“更安全的”
ast
等效)生成一个列表:

In [156]: eval("[1, 2, 3]")                                                                    
Out[156]: [1, 2, 3]
请注意,如果原始字符串使用数组而不是列表,则字符串将无法正常工作

In [157]: str(_155)                                                                            
Out[157]: '[1 2 3]'
它缺少一个方便的逗号。更糟糕的是,如果数组足够大,它可能包含

这种情况经常出现,通常是因为人们无意中用这些列表或数组元素保存了一个框架。到目前为止,我还没有看到一个很好的替代方案——至少如果你想要一个可读的csv的话

在某种程度上,带有列表或数组元素的数据帧是一种畸变。列dtype将是object,不可能进行快速numpy操作。但是熊猫也对字符串使用对象数据类型


此外,对于长度不同的列表,您无法创建n-d数组。它只能是列表或对象数据类型数组。数值数组的计算速度消失。

是否要求
.csv
?如果你想在I/O操作之间保持对象的持久性,那么可以存储Python对象的文件格式更好。我现在使用CSV的原因是因为我可以很容易地附加到它(逐行),并从各种编程语言(Python、C++、No.java)中读取它。然而,我想测试一下我是否可以用拼花地板代替。但是,我想拼花地板并没有针对附加用例进行真正的优化。你能推荐另一种格式吗?我刚刚运行了一些测试,并在拼花地板上附加了更大的文件。另外,node还没有官方的拼花写手。啊,我主要想知道是否所有东西都完全在python中。由于情况并非如此,像
.pkl
这样的东西可能不值得这么做。不幸的是,eval/literal\u eval比我的解析慢约6倍