在Python中,如何将包含未对齐数据的.txt文件加载到数据帧中
下面提到了.txt格式的数据文件(df),其中一些记录缺少几个字段。缺少的字段应在相应列中保持为空白 例如,txt格式的数据文件是在Python中,如何将包含未对齐数据的.txt文件加载到数据帧中,python,excel,pandas,text,python-import,Python,Excel,Pandas,Text,Python Import,下面提到了.txt格式的数据文件(df),其中一些记录缺少几个字段。缺少的字段应在相应列中保持为空白 例如,txt格式的数据文件是 1,name=Messi,car=ford,Price=234,Bike=Harley 2,name=Cavani,car=mazda,price=58,Bike=Ducatti 3,name=Dembele,car=toyota,Bike=Yamaha 4,name=kevin,car=Ford,price=989 5,name=A
1,name=Messi,car=ford,Price=234,Bike=Harley
2,name=Cavani,car=mazda,price=58,Bike=Ducatti
3,name=Dembele,car=toyota,Bike=Yamaha
4,name=kevin,car=Ford,price=989
5,name=Aguero,Bike=Ducatti
6,name=nadal,car=Ferrari,Bike=Harley
我希望文件以以下格式加载到Python:
具有相应列名的必需输出:
我想要的列名称为数字,卡纳姆,价格,比克内姆。我希望在数据框中填充各个列名称下的各个数据。各列字段下的空值应保持为空
由于格式问题,我无法发布输出图像或在此处键入输出。由于我是stackoverflow的新手,我没有足够的声誉来发布图片
请注意,我的数据集有数百万条记录。可能很难找到一个高效的库来专门处理这种非标准和非统一的文件格式。因此,我将逐行手动解析该文件,将其解析为dict的
列表
,其中缺少的键(列)可以由DataFrame()
构造函数处理
代码:
结果:
print(df)
Number Name Car Price Bike
0 1 Messi ford 234 Harley
1 2 Cavani mazda 58 Ducatti
2 3 Dembele toyota NaN Yamaha
3 4 kevin Ford 989 NaN
4 5 Aguero NaN NaN Ducatti
5 6 nadal Ferrari NaN Harley
您可以将数据写入中间CSV。添加一些文件修改时间检查,只有在数据文本文件发生更改时才能进行转换
import io
import csv
import pandas as pd
from pathlib import Path
header = ["Number", "CARNAME", "PRICE", "BIKENAME"]
key_to_index = {"car":1, "Price":2, "Bike":3}
def build_car_info_csv(in_fileobj, out_fileobj):
reader = csv.reader(in_fileobj)
writer = csv.writer(out_fileobj)
for row in reader:
outrow = [''] *len(header)
outrow[0] = row.pop(0)
for cell in row:
key, val = cell.split("=")
try:
outrow[key_to_index[key]] = val
except KeyError:
# ignore unwanted keys
pass
writer.writerow(outrow)
def read_car_info_df(filename):
filename = Path(filename)
csv_filename = filename.with_suffix(".csv")
mtime = filename.stat().st_mtime
csv_mtime = csv_filename.stat().st_mtime if csv_filename.is_file() else 0
if mtime > csv_mtime:
with filename.open(newline="") as infile,\
csv_filename.open("w", newline="") as outfile:
build_car_info_csv(infile, outfile)
return pd.read_csv(csv_filename)
测试
open("mytest.txt", "w").write("""1,name=Messi,car=ford,Price=234,Bike=Harley
2,name=Cavani,car=mazda,price=58,Bike=Ducatti
3,name=Dembele,car=toyota,Bike=Yamaha
4,name=kevin,car=Ford,price=989 5,name=Aguero,Bike=Ducatti
6,name=nadal,car=Ferrari,Bike=Harley""")
df = read_car_info_df("mytest.txt")
print(df)
是否要在输出数据框中保留那些
name=
,car=
字符?如果数据不适合导入类型,请首先转换数据。您可以编写一个中间csv并使用它。5,name=Aguero…
是否与4
在同一行,或者它是一个拼写错误?输入中有name和car,但输出中有CARNAME。这些是如何映射的?Hi@BillHuang,不,我不想保留name=,car=,我只需要相应名称的值Hi@Bill Huang,谢谢,当我运行上述命令时,我在7 dic[“Number”]=ls[0]中得到以下错误,ValueError Traceback(最近一次调用)8对于ls中的k_v[1::]:--->9 k,v=k_v.split(“=”)10 dic[k.capitalize()]=v.strip()11 ls_dic.append(dic)value错误:没有足够的值来解包(预期为2,得到1)请打印出该行。您的数据已损坏。有些单元格的格式不是name=value
,但我无法调试我看不到的内容。请注意,这已经超出了问题本身的范围,因此您可能需要根据实际情况自定义函数。谢谢@Bill Hunag。我感谢你的帮助。
open("mytest.txt", "w").write("""1,name=Messi,car=ford,Price=234,Bike=Harley
2,name=Cavani,car=mazda,price=58,Bike=Ducatti
3,name=Dembele,car=toyota,Bike=Yamaha
4,name=kevin,car=Ford,price=989 5,name=Aguero,Bike=Ducatti
6,name=nadal,car=Ferrari,Bike=Harley""")
df = read_car_info_df("mytest.txt")
print(df)