我有一个显示数据示例的文件,如下所示
CAR REPORT AREA 1
Car Honda Country America
Type Car
Built. location Japan Ship. location China
Date 2023/01/02 transport shipping
============================================================================================================================
PPM Price Age
============================================================================================================================
2,000 100 12
3,000 100 13
3,000 100 13
3,000 100 13
3,000 100 13
CAR REPORT AREA 2
Car Toyota Country America
Type Car
Built. location Japan Ship. location China
Date 2023/01/02 transport shipping
============================================================================================================================
PPM Price Age
============================================================================================================================
2,000 100 12
3,000 100 13
3,000 100 13
3,000 100 13
3,000 100 13
我尝试在 pandas/python 中编写一个脚本,以便我可以生成如下所示的数据框
我尝试通过 python 打开一个文件并读取逐行,我所做的是执行正则表达式,将标题部分等小节放入单独的数据帧中,然后执行合并回来。它可以工作,但效率有点低。
我想知道是否有任何现成的 pandas 函数可以利用,而不是循环遍历文件,因为涉及多个部分和多个文件。
CAR | COUNTRY | TYPE | Built.Location | ship.Location | Date | Transport | PPM | Price| Age
Honda| America | Car | Japan | China | 2023/01/02 | shipping | 2,000 | 100| 12
Honda| America | Car | Japan | China | 2023/01/02 | shipping | 3,000 | 100| 13
Honda| America | Car | Japan | China | 2023/01/02 | shipping | 3,000 | 100| 13
Honda| America | Car | Japan | China | 2023/01/02 | shipping | 3,000 | 100| 13
Honda| America | Car | Japan | China | 2023/01/02 | shipping | 3,000 | 100| 13
Toyota| America | Car | Japan | China | 2023/01/02 | shipping | 2,000 | 100| 12
Toyota| America | Car | Japan | China | 2023/01/02 | shipping | 3,000 | 100| 13
Toyota| America | Car | Japan | China | 2023/01/02 | shipping | 3,000 | 100| 13
Toyota| America | Car | Japan | China | 2023/01/02 | shipping | 3,000 | 100| 13
Toyota| America | Car | Japan | China | 2023/01/02 | shipping | 3,000 | 100| 13
很遗憾,没有现成的 Pandas 函数可以完全满足的需求来解析此结构。的方法(使用正则表达式并将数据分成更小的数据帧)实际上是处理这种半结构化数据的稳健方法。
以下是如何使用正则表达式和 Pandas 更高效地实现此方法:
import re
import pandas as pd
# 读取整个文件
with open('car_data.dat', 'r') as f:
data = f.read()
# 使用正则表达式来提取数据块
car_reports = re.split(r'={50,}', data)
# 初始化结果列表
all_data = []
# 循环遍历每个汽车报告
for report in car_reports:
# 使用正则表达式提取标题信息
header_match = re.search(r'Car\s+(.*?)\s+Country\s+(.*)', report, re.DOTALL)
if header_match:
car, country = header_match.groups()
# 使用正则表达式提取其他标题信息
other_info = re.findall(r'\s+(.+?)\s{2,}(.+)', report)
info_dict = dict(other_info)
# 提取表格数据
df = pd.read_csv(pd.compat.StringIO(report), sep='\s+', skiprows=3, engine='python')
# 添加标题信息作为列
df['Car'] = car.strip()
df['Country'] = country.strip()
df.update(info_dict)
all_data.append(df)
# 合并所有数据帧
final_df = pd.concat(all_data, ignore_index=True)
# 重新排列列
final_df = final_df[['Car', 'Country', 'Type', 'Built. location', 'Ship. location', 'Date', 'transport', 'PPM', 'Price', 'Age']]
print(final_df)
说明:
-
使用正则表达式高效提取:
代码使用
re.split
将文件分割成各个汽车报告块,并使用re.search
和re.findall
提取标题信息。 -
利用 Pandas 的字符串 I/O:
pd.compat.StringIO
将每个报告块转换为类似文件的对象,允许pd.read_csv
直接解析表格数据。 - 逐步构建数据帧: 代码循环遍历每个报告块,提取信息,创建临时数据帧,然后将这些临时数据帧追加到列表中。
-
最后合并:
最后,
pd.concat
将所有临时数据帧合并成一个最终数据帧。
通过这种方式,可以利用正则表达式的强大功能来处理结构,并仍然使用 Pandas 的高效功能来处理表格数据,从而使流程更高效。
标签:python,pandas From: 78807556