我有一些来自python剖析器的剖析结果,如下所示。
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
30 121.8 MiB 121.8 MiB @profile(stream=f)
31 def parse_data(data):
32 121.8 MiB 0.0 MiB Y=data["price"].values
33 121.8 MiB 0.0 MiB Y=np.log(Y)
34 121.8 MiB 0.0 MiB features=data.columns
35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
36 126.3 MiB 4.5 MiB X=data[X1].values
37 126.3 MiB 0.0 MiB ss=StandardScaler()
38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
39 124.6 MiB 0.0 MiB return X,Y
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
41 127.1 MiB 127.1 MiB @profile(stream=f)
42 def linearRegressionfit(Xt,Yt,Xts,Yts):
43 127.1 MiB 0.0 MiB lr=LinearRegression()
44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
46
现在,我需要获得这些结果用于绘图和其他用途。但这些文本不是很方便的东西。表中显示的是逐行剖析结果。如何获得pandas数据框架或表格版本?它可以用来获取这个表中的任何行或列。 ?
P.S. I have visited regex
和 parsimonious
但似乎不能让它们在我的案例中使用。
这只是一个小小的解析练习。通过标准的split()和一些小的调整,你可以在几行代码中得到一个非常干净的数据框架。
txt = '''
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
30 121.8 MiB 121.8 MiB @profile(stream=f)
31 def parse_data(data):
32 121.8 MiB 0.0 MiB Y=data["price"].values
33 121.8 MiB 0.0 MiB Y=np.log(Y)
34 121.8 MiB 0.0 MiB features=data.columns
35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
36 126.3 MiB 4.5 MiB X=data[X1].values
37 126.3 MiB 0.0 MiB ss=StandardScaler()
38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
39 124.6 MiB 0.0 MiB return X,Y
Filename: main.py
Line # Mem usage Increment Line Contents
================================================
41 127.1 MiB 127.1 MiB @profile(stream=f)
42 def linearRegressionfit(Xt,Yt,Xts,Yts):
43 127.1 MiB 0.0 MiB lr=LinearRegression()
44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
'''
import pandas as pd
lines = []
for line in txt.split('\n'):
#print(line)
if line.startswith('Filename'): continue
if line.startswith('Line'): continue
if line.startswith('='): continue
if line == '': continue
data = [i.strip() for i in line.split()]
#Fix def lines
if data[1] == 'def':
data = [data[0],'','','','',' '.join(data[1:4])]
data = [data[0], ' '.join(data[1:3]), ' '.join(data[3:5]), data[-1]]
lines.append(data)
df = pd.DataFrame(lines, columns=['Line #', 'Mem usage', 'Increment','Line Contents'])
print(df)
Line # Mem usage Increment Line Contents
0 30 121.8 MiB 121.8 MiB @profile(stream=f)
1 31 def parse_data(data):
2 32 121.8 MiB 0.0 MiB Y=data["price"].values
3 33 121.8 MiB 0.0 MiB Y=np.log(Y)
4 34 121.8 MiB 0.0 MiB features=data.columns
5 35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
6 36 126.3 MiB 4.5 MiB X=data[X1].values
7 37 126.3 MiB 0.0 MiB ss=StandardScaler()
8 38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
9 39 124.6 MiB 0.0 MiB X,Y
10 41 127.1 MiB 127.1 MiB @profile(stream=f)
11 42 def linearRegressionfit(Xt,Yt,Xts,Yts):
12 43 127.1 MiB 0.0 MiB lr=LinearRegression()
13 44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
14 45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
然后你可以在以下情况下拆分数据框 '@profile'
是在 'Line Contents'
.
比如说,你想解析整个文本,还是你有一个文本文件,想为每个表解析,这一点并不完全清楚。
split_idx = df[df['Line Contents'].str.startswith('@profile')].index
dataframes = []
for i, idx in enumerate(split_idx):
try:
dataframes.append(df.iloc[idx, split_idx[i+1]])
except IndexError:
dataframes.append(df.iloc[idx:])
print(dataframes[0])
print('======')
print(dataframes[1])
Line # Mem usage Increment Line Contents
0 30 121.8 MiB 121.8 MiB @profile(stream=f)
1 31 def parse_data(data):
2 32 121.8 MiB 0.0 MiB Y=data["price"].values
3 33 121.8 MiB 0.0 MiB Y=np.log(Y)
4 34 121.8 MiB 0.0 MiB features=data.columns
5 35 121.8 MiB 0.0 MiB X1=list(set(features)-set(["price"]))
6 36 126.3 MiB 4.5 MiB X=data[X1].values
7 37 126.3 MiB 0.0 MiB ss=StandardScaler()
8 38 124.6 MiB 0.0 MiB X=ss.fit_transform(X)
9 39 124.6 MiB 0.0 MiB X,Y
10 41 127.1 MiB 127.1 MiB @profile(stream=f)
11 42 def linearRegressionfit(Xt,Yt,Xts,Yts):
12 43 127.1 MiB 0.0 MiB lr=LinearRegression()
13 44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
14 45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
======
Line # Mem usage Increment Line Contents
10 41 127.1 MiB 127.1 MiB @profile(stream=f)
11 42 def linearRegressionfit(Xt,Yt,Xts,Yts):
12 43 127.1 MiB 0.0 MiB lr=LinearRegression()
13 44 131.2 MiB 4.1 MiB model=lr.fit(Xt,Yt)
14 45 132.0 MiB 0.8 MiB predict=lr.predict(Xts)
并不完全清楚你是想解析整个文本 还是每个表都有一个文本文件,想解析表。
如果你想从每个表创建一个pandas数据框,使用 skiprows
参数为 read_fwf
应该是可行的(这将跳过文件中的非标准行,但解析其余部分)。在这里,我将第一个表的内容存储在一个文件中 sample-1.txt
并用 read_fwf
.
import pandas
df = pandas.read_fwf('sample-1.txt', skiprows=[1])
这就给出了下面的数据框架。
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 4 columns):
Line # 10 non-null int64
Mem usage 9 non-null object
Increment 9 non-null object
Line Contents 10 non-null object
dtypes: int64(1), object(3)
memory usage: 392.0+ bytes
如果你想把它分割成不同的表格,你必须在每次提到 Filename: main.py
.