将大型文本文件读入数据框中以在 Python 中进行数据分析
Posted
技术标签:
【中文标题】将大型文本文件读入数据框中以在 Python 中进行数据分析【英文标题】:Reading large text file into a dataframe for data analysis in Python 【发布时间】:2019-03-08 00:24:06 【问题描述】:我知道以前有人问过类似的问题。但我仍然无法找出为我的程序处理数据的最佳方法
我有一个大文本文件(50,000 到 5,000,000 行文本)。我需要处理这个文件的每一行并将其写入数据框,以便我可以对它们进行一些数据分析。
数据框有 9 列,大部分是浮点数和一些字符串,没有。行数〜没有。输入文件中的行数
目前,我正在使用“with open..”逐行读取此文件,然后使用正则表达式提取所需数据并将其作为一行写入数据框中。由于这是通过 For 循环,因此需要永远完成。
最好的方法是什么?任何指针或示例程序?我什至应该使用数据框吗?
这是我的代码。
def gcodetodf(self):
with open(self.inputfilepath, 'r') as ifile:
lflag = False
for item in ifile:
layermatch = self.layerpattern.match(item)
self.tlist = item.split(' ')
self.clist = re.split(r"(\w+)", item)
if layermatch and (str(self.tlist[2][:-1]) == 'end' or int(self.tlist[2][:-1]) == (self.endlayer + 1)):
break
if (layermatch and int(self.tlist[2][:-1]) == self.startlayer) or lflag is True:
lflag = True
# clist = re.split(r"(\w+)", item)
map_gcpat = bool(self.gonepattern.match(item)): self.gc_g1xyef,
bool(self.gepattern.match(item)): self.gc_g1xye,
bool(self.gtrpattern.match(item)): self.gc_g1xyf,
bool(self.resetextpattern.match(item)): self.gc_g92e0,
bool(self.ftpattern.match(item)): self.gc_ftype,
bool(self.toolcompattern.match(item)): self.gc_toolcmt,
bool(self.layerpattern.match(item)): self.gc_laycmt,
bool(self.zpattern.match(item)): self.gc_g1z
map_gcpat.get(True, self.contd)()
# print(self.newdataframe)
写入数据帧的示例函数如下所示:
def gc_g1xye(self):
self.newdataframe = self.newdataframe.append(
'Xc': float(self.tlist[1][1:]), 'Yc': float(self.tlist[2][1:]), 'Zc': self.gc_z,
'E': float(self.tlist[3][1:]),
'F': None, 'FT': self.ft_var, 'EW': self.tc_ew, 'LH': self.tc_lh, 'Layer': self.cmt_layer,
ignore_index=True)
示例输入文件:
........
G1 X159.8 Y140.2 E16.84505
G1 X159.8 Y159.8 E17.56214
M204 S5000
M205 X30 Y30
G0 F2400 X159.6 Y159.8
G0 X159.33 Y159.33
G0 X159.01 Y159.01
M204 S500
M205 X20 Y20
;TYPE:SKIN
G1 F1200 X140.99 Y159.01 E18.22142
G1 X140.99 Y140.99 E18.8807
G1 X159.01 Y140.99 E19.53999
G1 X159.01 Y159.01 E20.19927
M204 S5000
M205 X30 Y30
G0 F2400 X150.21 Y150.21
M204 S500
M205 X20 Y20
G1 F1200 X149.79 Y150.21 E20.21464
G1 X149.79 Y149.79 E20.23
G1 X150.21 Y149.79 E20.24537
G1 X150.21 Y150.21 E20.26073
M204 S5000
M205 X30 Y30
G0 F2400 X150.61 Y150.61
M204 S500
M205 X20 Y20
G1 F1200 X149.39 Y150.61 E20.30537
G1 X149.39 Y149.39 E20.35
G1 X150.61 Y149.39 E20.39464
..........
【问题讨论】:
你能举个例子,数据是什么样的,你需要什么处理?先将其读入数据帧然后再进行处理可能更容易。 @Lidae 我已经用文件的示例块更新了帖子。我需要对其进行数学运算。例如。从 col1 和 col2 中取值来计算圆的面积;将所有区域加在一起并绘制图形。 好吧,我有点希望你能用 read_csv 之类的东西来做解析。看到这让我觉得解析必须是手动的。速度方面的瓶颈可能是 self.newdataframe = self.newdataframe.append 这一行。尝试先附加到一个列表,然后使用该列表一次创建所有数据框,否则它会做很多不必要的复制。 【参考方案1】:请注意,DataFrame.append 返回旧 DataFrame 的副本并添加了新行:它不能就地工作。逐行构造一个 DataFrame,然后使用 append 将在 O(n^2) 而不是 O(n) 中工作,如果你有 500 万行,这是相当糟糕的......
您想要做的是首先将每一行附加到一个列表(字典列表很好),然后在完成所有解析后从中创建 DataFrame 对象。这会更快,因为附加到列表是在恒定时间内完成的,因此您的总复杂度应该是 O(n)。
def gc_g1xye(self):
self.data.append(
'Xc': float(self.tlist[1][1:]), 'Yc': float(self.tlist[2][1:]), 'Zc': self.gc_z,
'E': float(self.tlist[3][1:]),
'F': None, 'FT': self.ft_var, 'EW': self.tc_ew, 'LH': self.tc_lh, 'Layer': self.cmt_layer)
...
# Once the parsing is done:
self.newdataframe = pd.DataFrame(self.data)
这是最好的方法吗?对我来说,这似乎是一个好的开始。你应该使用 DataFrame 吗?从您所说的解析数据后要对数据执行的操作来看,DataFrame 听起来是个不错的选择。
作为一个不相关的随机提示,我推荐使用 tqdm 包来显示你的 for 循环的进度条。它非常易于使用,它可以帮助您判断是否值得等待该循环完成!
【讨论】:
这听起来是个好主意。但是,到最后,我不会有一个价值数百万行的数据框以及一个列表的副本吗?我应该清除此列表吗? 是的,我相信数据框会复制数据,所以如果空间是一个问题,你可以在之后删除列表。以上是关于将大型文本文件读入数据框中以在 Python 中进行数据分析的主要内容,如果未能解决你的问题,请参考以下文章
需要 Tkinter 帮助:尝试在按下按钮时将文本输入到条目中以在控制台中打印。我无法打印[重复]