首页 > 编程问答 >将 dat 文件中的数据标准化为 pandas 数据框

将 dat 文件中的数据标准化为 pandas 数据框

时间:2024-07-30 05:37:45浏览次数:12  
标签:python pandas

我有一个显示数据示例的文件,如下所示

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)

说明:

  1. 使用正则表达式高效提取: 代码使用 re.split 将文件分割成各个汽车报告块,并使用 re.search re.findall 提取标题信息。
  2. 利用 Pandas 的字符串 I/O: pd.compat.StringIO 将每个报告块转换为类似文件的对象,允许 pd.read_csv 直接解析表格数据。
  3. 逐步构建数据帧: 代码循环遍历每个报告块,提取信息,创建临时数据帧,然后将这些临时数据帧追加到列表中。
  4. 最后合并: 最后, pd.concat 将所有临时数据帧合并成一个最终数据帧。

通过这种方式,可以利用正则表达式的强大功能来处理结构,并仍然使用 Pandas 的高效功能来处理表格数据,从而使流程更高效。

标签:python,pandas
From: 78807556

相关文章

  • 使用 kivy 从 python 脚本的 buildozer 构建 android apk 时出错
    我想从使用kivy包构建的Python脚本构建apk为此,我使用googlecollab.这里是main.py脚本:importyoutube_dlfromkivy.appimportAppfromkivy.uix.boxlayoutimportBoxLayoutfromkivy.uix.buttonimportButtonfromkivy.uix.tex......
  • 自动解码并检索 S/MIME 加密电子邮件的正文 (python)
    我如何:用python代码连接我的邮件收件箱以自动获取未读电子邮件的加密内容;解码S/MIME加密电子邮件(我有密钥);检索电子邮件正文纯文本;检查正文(或主题)是否与某个关键字(现在为“test”)匹配,并在匹配时打印一些内容;在树莓派上使用此代码,无需手动......
  • Python 3 写入 DBF(带有 Memo 的 dBase IV)
    我需要在Python3中写入带有备注字段的dBaseIVdbf文件,但找不到合适的模块来执行此操作。我尝试过的包:Simpledbf-只读dbf-不支持dBaseIVdbfpy-不支持Python3dbfpy3-不支持dBaseIVYDbf-不支持备注字段pyshp-无法仅使用dbf文件......
  • Robin-Stocks Python 中的 order_buy_fractional_by_price 问题
    我在Robin-StocksPython包中的order_buy_fractional_by_price函数中遇到问题。在正常市场交易时间内下达以美元为基础的买入订单时,该订单被错误地设置为限价订单。对我来说看起来有问题的代码似乎是导致此问题的原因。我尝试在包管理器中本地修改或删除有问题的代码,但遇......
  • 在python中使用turtle绘制图案(带点)
    我正在尝试使用python中的海龟制作一幅赫斯特画(点图案)。我设法实现了它。Hirst_painting_dot_pattern但是我的for循环没有按照我预期的方式工作。它省略了最后一次迭代。在下面的代码中,我的for循环没有生成最后一个点。因此,我在循环末尾添加了一行来制作最后......
  • 使用 Python 进行 QuantLib Vanilla 掉期定价 - 错误
    我真的需要帮助...我有一个使用QuantLib构建自己的VanillaSwapPricer的项目。我想根据ois掉期的市场价格进行计算以进行贴现,并根据Euribor6M掉期+FRA进行预测固定。总而言之,我的目标是尽可能接近彭博社对标准Euribor6M掉期的定价(贴现ois)-fwdEuribor6M)。......
  • 我正在制作一个可以打开wav文件的python程序,我想知道wav文件的格式是什么
    因此,我已经通过此网站的研究编写了验证并读取wav标头的代码。但我想知道,data段中的数据是如何存储的?它们位于16位部分中,彼此相邻放置。我认为在Audacity中制作440hz正弦波,然后导出它,会显示一些结果,并且字节确实看起来更整齐,但仍然像废话一样接缝。相信我,我已经......
  • python - 面板库 - PasswordInput 不会对回车做出反应
    我试图避免需要提交按钮。以下代码当前正在远程jupyter实验室运行。仅当光标焦点从密码小部件中移除后,才会打印该消息。我想要回车来触发消息打印。有什么线索吗?frompanel.widgetsimportPasswordInput,TextInputpn.extension()defon_enter(event=None):message_p......
  • pandas read_sql 导致值错误:“年份 -10100 超出范围”由数据库中的日期损坏引起
    我正在运行一个脚本将数据从oracle迁移到postgres。运行以下命令时df=pd.read_sql(query,oracle_conn,)会导致错误ValueError:year-10100isoutofrange对于跨越数千的某些行,有些日期已损坏并且年份数字很大。例如,下面是损坏的日期,而下一......
  • 即使安装了软件包,也找不到 python 模块句子转换器
    对于我的python脚本(如下所示),我使用句子转换器包,其中包含SBERT模型。即使在执行“piplist”时明确列出该软件包,并且还安装了torch,所有内容都更新到最新版本,但仍然找不到该模块。脚本:importnumpyasnpimportpandasaspdfromsentence_transformersimportSenten......