Python 中 CSV 数据的数据类型识别/猜测

2024-05-16 13:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是处理大型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朝着类似的方向发展。 不过,我担心性能,因为我可能要处理许多大型电子表格(数据来源于此)


Tags: 文件csv数据方法算法asfloat例子
3条回答

经过深思熟虑,我将亲自设计算法:

  • 出于性能原因:为每一列抽取一个样本(比如1%)
  • 对示例中的每个单元格运行regex匹配,检查数据类型
  • 根据频率分布为列选择适当的数据类型

出现的两个问题:

  • 什么样的样本量足够?对于小数据集?对于大型数据集?
  • 根据频率分布选择数据类型的阈值有多高?

您可以尝试使用regex进行预分析。例如:

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

这样你就可以做一个regex字典,并尝试每一个,直到找到一个匹配的

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

不要忘记行乞时的“^”和结尾的“$”,否则regex可以匹配字符串的一部分并返回一个对象。

希望这有帮助:)

您可能会对这个python库感兴趣,它正是为您对csv和XLS文件进行这种类型猜测的库:

它可以很高兴地扩展到非常大的文件,从互联网上传输数据等等

还有一个更简单的包装器库,它包含一个名为dataconverters的命令行工具:http://okfnlabs.org/dataconverters/(和一个在线服务:https://github.com/okfn/dataproxy!)

进行类型猜测的核心算法如下:https://github.com/okfn/messytables/blob/7e4f12abef257a4d70a8020e0d024df6fbb02976/messytables/types.py#L164

相关问题 更多 >