Python 是否可以使用矢量化代码解析包含数组的csv列?
下面的代码生成一个CSV,然后再次解析它。列b包含每个字段的整数数组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]"
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倍