Pandas 将txt文件转换为数据帧

Pandas 将txt文件转换为数据帧,pandas,dataframe,text,Pandas,Dataframe,Text,我有一个文本文件,想把它变成一个数据框。不幸的是,文本文件的结构使我很难做到这一点 文本文件如下所示: ======> EVENT:130 a = 1.4 b = 2.5 c = 1.7 ======> EVENT:698 a = 1.2 b = 4.3 c = 2.4 ======> EVENT:1055 a = 3.4 b = 4.5 c = 2.3 “事件:”后面的数字是随机的。我想将此文本文件转换为具有以下结构的pandas数据框架 a b c 1.

我有一个文本文件,想把它变成一个数据框。不幸的是,文本文件的结构使我很难做到这一点

文本文件如下所示:

======> EVENT:130
a = 1.4
b = 2.5
c = 1.7
======> EVENT:698
a = 1.2
b = 4.3
c = 2.4
======> EVENT:1055
a = 3.4
b = 4.5
c = 2.3
“事件:”后面的数字是随机的。我想将此文本文件转换为具有以下结构的pandas数据框架

  a    b    c 
1.4  2.5  1.7
1.2  4.3  2.4
3.4  4.5  2.3

所以我希望每个事件都在数据帧的一行中。如何删除“=======>事件:xxxx”行?或者我如何使用这行命令pd.read_csv()在df中开始一个新行?有没有办法让pd.read_csv()意识到“=”左侧是列名,右侧是该列的条目?

您可以使用
re
模块创建自定义解析器。例如:

重新导入
作为pd进口熊猫
打开(“your_file.txt”、“r”)作为f_in:
data=f_in.read()
所有_数据=[]
对于重新拆分中的事件(r.“*event.*”,数据):
如果不是,则为event.strip():
持续
d={}
对于k,v在re.findall(r“\s*(.*)\s*=\s*(.*)\s*”,事件中):
d[k]=v
所有_数据。追加(d)
df=pd.DataFrame(所有数据)
打印(df)
印刷品:

abc
0  1.4  2.5  1.7
1  1.2  4.3  2.4
2  3.4  4.5  2.3

您可以使用
re
模块创建自定义解析器。例如:

重新导入
作为pd进口熊猫
打开(“your_file.txt”、“r”)作为f_in:
data=f_in.read()
所有_数据=[]
对于重新拆分中的事件(r.“*event.*”,数据):
如果不是,则为event.strip():
持续
d={}
对于k,v在re.findall(r“\s*(.*)\s*=\s*(.*)\s*”,事件中):
d[k]=v
所有_数据。追加(d)
df=pd.DataFrame(所有数据)
打印(df)
印刷品:

abc
0  1.4  2.5  1.7
1  1.2  4.3  2.4
2  3.4  4.5  2.3
试试这个:

from io import StringIO
import pandas as pd

txtfile = StringIO("""======> EVENT:130
a = 1.4
b = 2.5
c = 1.7
======> EVENT:698
a = 1.2
b = 4.3
c = 2.4
======> EVENT:1055
a = 3.4
b = 4.5
c = 2.3""")

df = pd.read_csv(txtfile, sep = '\s\s+', header=None, engine='python')

dfi = df[0].str.split(' = ', expand=True)
dfi = dfi[dfi[0].isin([*'abc'])]
df_out = dfi.set_index([dfi.groupby(0).cumcount(), 0])[1].unstack()
print(df_out)
输出:

0    a    b    c
0  1.4  2.5  1.7
1  1.2  4.3  2.4
2  3.4  4.5  2.3
试试这个:

from io import StringIO
import pandas as pd

txtfile = StringIO("""======> EVENT:130
a = 1.4
b = 2.5
c = 1.7
======> EVENT:698
a = 1.2
b = 4.3
c = 2.4
======> EVENT:1055
a = 3.4
b = 4.5
c = 2.3""")

df = pd.read_csv(txtfile, sep = '\s\s+', header=None, engine='python')

dfi = df[0].str.split(' = ', expand=True)
dfi = dfi[dfi[0].isin([*'abc'])]
df_out = dfi.set_index([dfi.groupby(0).cumcount(), 0])[1].unstack()
print(df_out)
输出:

0    a    b    c
0  1.4  2.5  1.7
1  1.2  4.3  2.4
2  3.4  4.5  2.3

您可以为
pd.read\u csv
函数创建一个自定义的类似文件的对象(类似于适配器)

优点:速度快,内存效率高

这是我的实现

将熊猫作为pd导入
#自定义类文件对象
#它必须定义uuuuuuuuuuuuuuuu iter()和read()方法
类事件文件:
定义初始化(自身,路径):
self.path=path
self.fd=无
self.lineno=0
#用作上下文管理器以在处理结束时关闭文件
定义输入(自我):
self.fd=打开(self.path)
回归自我
定义退出(自我,*args,**kwargs):
self.fd.close()
#只需像标准的open()函数一样返回行
定义(自我):
尽管如此:
line=self.read()
如果不是直线:
返回
生产线
#实际返回csv行
def读取(自身,大小=无):
columns={}#我们对未来列的缓冲区{:}
尽管如此:
#从基础文件中读取行
line=self.fd.readline()
#处理EOF
如果不是直线:
返回self.\u build\u csv\u行(columns.values()),如果列不是“”
#跳过第一行
如果“事件”在第行而不是第列中:
持续
#刷新缓冲区
如果行中有“事件”:
self.lineno+=1
csv_line=“”
如果self.lineno==1:
#发射头
csv\u line+=self.\u build\u csv\u line(columns.keys())
csv\u line+=self.\u build\u csv\u line(columns.values())
返回csv_行
名称,值=行。拆分(“”)
列[name.strip()]=value.strip()
定义构建csv行(自身、值):
返回“,”.join(值)+“\n”
#用法
将事件文件(“test.csv”)作为f:
数据=pd.read\u csv(f)

您可以为
pd.read\u csv
功能创建一个自定义的类似文件的对象(类似于适配器)

优点:速度快,内存效率高

这是我的实现

将熊猫作为pd导入
#自定义类文件对象
#它必须定义uuuuuuuuuuuuuuuu iter()和read()方法
类事件文件:
定义初始化(自身,路径):
self.path=path
self.fd=无
self.lineno=0
#用作上下文管理器以在处理结束时关闭文件
定义输入(自我):
self.fd=打开(self.path)
回归自我
定义退出(自我,*args,**kwargs):
self.fd.close()
#只需像标准的open()函数一样返回行
定义(自我):
尽管如此:
line=self.read()
如果不是直线:
返回
生产线
#实际返回csv行
def读取(自身,大小=无):
columns={}#我们对未来列的缓冲区{:}
尽管如此:
#从基础文件中读取行
line=self.fd.readline()
#处理EOF
如果不是直线:
返回self.\u build\u csv\u行(columns.values()),如果列不是“”
#跳过第一行
如果“事件”在第行而不是第列中:
持续
#刷新缓冲区
如果行中有“事件”:
self.lineno+=1
csv_line=“”
如果self.lineno==1:
#发射头
csv\u line+=self.\u build\u csv\u line(columns.keys())
csv\u line+=self.\u build\u csv\u line(columns.values())
返回csv_行
名称,值=行。拆分(“”)
列[name.strip()]=value.strip()
定义构建csv行(自身、值):
返回“,”.join(值)+“\n”
#用法
将事件文件(“test.csv”)作为f:
数据=pd.read\u csv(f)