python中CSV数据的数据类型识别/猜测
Posted
技术标签:
【中文标题】python中CSV数据的数据类型识别/猜测【英文标题】:Data Type Recognition/Guessing of CSV data in python 【发布时间】:2011-10-13 02:00:04 【问题描述】:我的问题在于处理大型 CSV 文件中的数据。
我正在寻找基于在该列中找到的值来确定(即猜测)该列的数据类型的最有效方法。我可能正在处理非常混乱的数据。因此,该算法应该具有一定的容错性。
这是一个例子:
arr1 = ['0.83', '-0.26', '-', '0.23', '11.23'] # ==> recognize as float
arr2 = ['1', '11', '-1345.67', '0', '22'] # ==> regognize as int
arr3 = ['2/7/1985', 'Jul 03 1985, 00:00:00', '', '4/3/2011'] # ==> recognize as date
arr4 = ['Dog', 'Cat', '0.13', 'Mouse'] # ==> recognize as str
底线:我正在寻找一个 python 包或一个可以检测两者的算法
CSV 文件的架构,甚至更好 单个列的数据类型 作为一个数组Method for guessing type of data represented currently represented as strings 也朝着类似的方向发展。 不过,我担心性能,因为我可能要处理许多大型电子表格(数据的来源)
【问题讨论】:
【参考方案1】:您可以尝试使用正则表达式进行预解析。例如:
import re
pattern = re.compile(r'^-?\d+.1\d+$')
data = '123.42'
print pattern.match(data) # ----> object
data2 = 'NOT123.42GONNA31.4HAPPEN'
print pattern.match(data2) # ----> None
这样你可以做一个正则表达式的字典,然后尝试每一个,直到找到匹配项
myregex = int: r'^-?\d+$', float: r'^\d+.1\d+$', ....
for key, reg in myregex.items():
to_del = []
for index, data in enumerate(arr1):
if re.match(reg,data):
d = key(data) # You will need to insert data differently depending on function
....#---> do something
to_del.append(data) # ---> delete this when you can from arr1
不要忘记开头的'^'和结尾的'$',否则正则表达式可以匹配部分字符串并返回一个对象。
希望这会有所帮助:)
【讨论】:
请记住re.match
匹配字符串的开头,因此 ^
不是必需的。 (re.search
匹配任何地方。)
我自己考虑过正则表达式。如果我可以依靠数据是干净的事实,这可能就是要走的路。虽然我仍然可以看到性能问题。
这个想法是把 arr1 中剩下的内容记录下来,以确定数据应该放在哪里,或者你是否认为它是垃圾【参考方案2】:
经过一番思考,这就是我自己设计算法的方式:
出于性能原因:为每列抽取一个样本(例如 1%) 为样本中的每个单元格运行正则表达式匹配,检查数据类型 根据频率分布为列选择适当的数据类型出现的两个问题:
什么是足够的样本量?对于小数据集?对于大型数据集? 根据频率分布选择数据类型的足够高阈值是多少?【讨论】:
【参考方案3】:我在 c# 中解决了同样的问题。 这就是我构建样本集的方式: 对于 CSV 中的每一列,我选择了值最长的行以及值最短的行。 然后我用第一个 50 个非空行构建了一个数组。 所以我的样本至少有 0 行,最多有 50 行,它们覆盖了一列中的整个范围。 之后,我会尝试从最宽的定义解析到最窄的:
如果(值为字符串)则 thisType = String;
if (value is DateTime) then thisType is DateTime;
如果(值为十进制)则thisType为十进制;
if (value is Integer) then thisType is Integer;
if (value is Boolean) then thisType is Boolean;
我在 C# 中使用TryParse,但我确信其他语言也有类似的方法可以使用。
【讨论】:
【参考方案4】:您可能对这个 python 库感兴趣,它可以为您对 CSV 和 XLS 文件进行这种类型猜测:
https://github.com/okfn/messytables https://messytables.readthedocs.org/ - 文档它很高兴地扩展到非常大的文件,从互联网上流式传输数据等。
还有一个更简单的包装库,其中包括一个名为 dataconverters 的命令行工具:http://okfnlabs.org/dataconverters/(和一个在线服务:https://github.com/okfn/dataproxy!)
类型猜测的核心算法在这里:https://github.com/okfn/messytables/blob/7e4f12abef257a4d70a8020e0d024df6fbb02976/messytables/types.py#L164
【讨论】:
【参考方案5】:也许csvsql 在这里有用?不知道它的效率如何,但绝对可以完成从 csvs 生成 sql create table 语句的工作。
$ csvsql so_many_columns.csv >> sql_create_table_with_char_types.txt
【讨论】:
以上是关于python中CSV数据的数据类型识别/猜测的主要内容,如果未能解决你的问题,请参考以下文章
将 csv 文件导入 python 后,为啥我的某些数据列在我的数据框中无法识别