【问题标题】:How to split a huge text dataset in python?如何在python中拆分巨大的文本数据集?
【发布时间】:2018-09-07 18:54:28
【问题描述】:

我的机器学习项目的第一部分是将庞大的数据集分成 3 部分,然后将它们用作训练数据集和测试数据集。该数据集包含 1000 万行,如下所示:

上图是我的数据集的截图。我不想更改列或行的顺序,所以随机在这里不起作用。如您所见,它们是由制表符分隔的 6 列,包含 1000 万行。我想将这些行分成 3 个单独的部分,其中前 3333333.333 行是我的 dataset1,然后第二个 3333333.333 行是 dataset2,其余的是 dataset3。所以3个不同的文本文件,组件(列)的顺序没有改变。 我正在使用 Spyder3,并在您的帮助下编写了以下代码:

f = open ( 'pr_data.txt' , 'r')  """Reading File"""

l = [ map(float,line.strip().split()) for line in f ]

no_samples = len(l)

data1 = l[0:int(no_samples/3)][:]

data2 = l[int(no_samples/3):int(no_samples*2/3)][:]

data3 = l[int(no_samples*2/3):no_samples][:]

file = open('data1.txt','w')
for row in data1: 
    file.writelines(["%s\t" % item for item in row]) 
    file.writelines("\n") 
file.close()

file = open('data2.txt','w')
for row in data2: 
    file.writelines(["%s\t" % item for item in row]) 
    file.writelines("\n") 
file.close()

file = open('data3.txt','w')
for row in data3: 
    file.writelines(["%s\t" % item for item in row]) 
    file.writelines("\n") 
file.close()

通过上面的代码,在同一个目录下创建了3个文本文件,但问题是:数字的精度发生了变化。例如,0 和 1 更改为 0.0 和 1.0。此外,其中一些不在同一列中。请看data1第一行的截图,如下:

请告诉我我的代码有多正确?

【问题讨论】:

  • 你想如何分割文件?随机拆分?
  • 另外,使用with时不需要关闭文件。
  • 感谢您的回答。不,不是随机的。正如您在我的数据集的屏幕截图中看到的那样,它们是由选项卡分隔的 6 列,包含 1000 万行。我想将这些行分成 3 个单独的部分,其中前 3333333.333 行是我的 dataset1,然后第二个 3333333.333 行是 dataset2,其余的是 dataset3。所以 3 个不同的文本文件,组件(列)的顺序没有改变。
  • 别忘了缩进with...之后的行
  • 请查看编辑后的问题,并将data1的截图与原始数据集的截图进行比较。

标签: python python-3.x machine-learning dataset


【解决方案1】:

打印需要普通括号 -> () 将您的代码更改为:

print(data.read())

如果您将数据作为字符串处理(在本例中就是这样),则应首先在每个新行处使用data.split("\n") 将其拆分。这将返回一个包含每一行的列表。

编辑: 现在您可以对该列表进行切片以获得 3 个单独的列表:

data1 = lines[0:1/3*len(lines)]
data2 = lines[1/3*len(lines):2/3*len(lines)]
data3 = lines[2/3*len(lines):len(lines)]

【讨论】:

  • 感谢您的及时答复。我更正了它,但是当我执行打印代码时,我收到了这个错误:“NameError: name 'data' is not defined”
  • 您是否更改了代码中的其他内容? data 应该存在于 with 块内。
  • 拆分后,它们将成为我的训练和测试数据集。我应该在上面应用离散贝叶斯规则、熵、决策规则、量化......。所以这些行不会是一个字符串,我应该找到每列中每个数字的概率。但第一步是将它们分成 3 个单独的数据集,我为此使用了 python。如果 windows 可以比 Python 更容易,请告诉我。
  • 我编辑了答案。如果你现在想把列表转回字符串,你可以打电话给"\n".join(data1)。这将在列表中的每个条目之间创建一个带有“\n”的字符串。
  • 在切片lines之前需要用lines = data.split("\n")定义它
【解决方案2】:

所以方法如下:

  1. 打开文件

  2. 在逐行读取文件时,使用 split() 方法拆分每一行。另外在拆分的同时也将得到的字符串转换成float。

  3. 现在您将整个文件作为浮点类型的多维数组。

  4. 获取样本数(行)。

  5. 使用切片存储第一个数据中从 0 到 rows/3 的行,data2 中的 rows/3 到 rows*2/3 以及 data3 中的其余行。

f = open ( 'input.txt' , 'r')
l = [ map(float,line.strip().split()) for line in f ]

no_samples = len(l)

data1 = l[0:int(no_samples/3)][:]

data2 = l[int(no_samples/3):int(no_samples*2/3)][:]

data3 = l[int(no_samples*2/3):no_samples][:]

//Write a multidimensional list to a file
file = open('data1.txt','w')
for row in data1: 
    file.writelines(["%s\t" % item for item in row]) 
    file.writelines("\n") 
file.close() 

【讨论】:

  • 很好的解释。它一直运行到“no_attrs = len(f[0])”。当我运行这一行时,我得到这个错误:“TypeError: '_io.TextIOWrapper' object is not subscriptable”
  • 好的。我删除了那条线,所有其他线都完美运行。现在,data1 应该包括所有 1000 万行的前 1/3,data2 包括第二个 1/3,data3 包括其余行。我怎样才能写data1,data2,data3? 3 个不同的文本文件在同一个目录中。
  • 有多种方法可以做到这一点。一种方法是使用 numpy 包并将多维列表转换为 2D numpy 数组,然后对每个文件简单地使用 numpy.savetxt(filename, 2D numpy array) 。我在我编辑的代码中显示的另一种方式。
  • 创建了 3 个文本文件但它们是空的,我也收到此错误:ValueError: could not convert string to float: ' 0.65258 0.52520 0.95356 0.14795 0.36442 1\n'
  • 我稍微改变了读取文件的方式。我没有指定任何拆分参数。我在一个简单的示例上进行了尝试,现在它工作正常。看看修改后的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
相关资源
最近更新 更多