【问题标题】:txt data cleaning up with pandas and regex使用 pandas 和正则表达式清理 txt 数据
【发布时间】:2021-02-04 16:02:28
【问题描述】:

我是超级初学者,但我正在尝试做一个 python scrypt,它会从我通常从 oracle 软件下载的 txt 文件中提取我感兴趣的数据。 通常,当我将其复制粘贴到 excel 中时很好,但是当我尝试用 pandas 打开它时,数据是一团糟。

我需要做的是获取每个单元的数量、成本和折旧准备金(标有黄色)。

我尝试使用此代码开始,但似乎由于某种原因 python 以错误的方式读取数据,它创建了很多列。

import pandas as pd
import re

regex = 'I?N?\d{6,7}-'

df = pd.read_table('process data.txt', delim_whitespace=True, encoding='latin-1')
df['merged'] = df['COMPAN'] + df['COMPANCOMPANNY,']
series = df['merged']

df1 = series.str.contains(regex)

df['check'] = df1
df

而且输出真的很糟糕:

那么你对如何开始实际有任何提示吗?我在想也许有一种方法可以从 TXT 加载表格并根据已建立的宽度将其划分为列?我也在寻找那个解决方案,但找不到。

这是一个 SkyDrive 链接 EXAMPLE FILE 和粘贴为文本的相同示例:https://pastebin.pl/view/d3b2b4f8

提前致谢!

【问题讨论】:

  • 请将您的示例数据以文本形式包含在内,而不是作为图片或指向外部站点的链接。在这种情况下,如果您在read_csv 中使用skiprows 参数跳过标题行,似乎可能会得到一个不错的结果
  • 感谢您的建议。我添加了 pastebin 链接。我也尝试跳过,但输出几乎相同,或者我在那里做错了什么

标签: python regex pandas oracle dataframe


【解决方案1】:

这可能不是您正在寻找的,但它可能会有所帮助。

我会在加载到 DataFrame 之前对数据进行预处理。使用链接中的示例文件,我执行了以下操作:

import re
re_row = re.compile(r'^.*?\s+'
                    r'(?P<id>\d+).*\s+[\d,.]+\s+'
                    r'(?P<cost>[\d,.]+)\s+[\d,.]+\s+[\d,.]+\s+'
                    r'(?P<depr_res>[\d,.]+)\s+[\d,.]+$',
                    re.VERBOSE)

data = []
with open('process data.txt', 'r') as fin:
    for line in fin:
        if re_row.match(line):
            id, cost, depr_res = re_row.match(line).groups()
            data.append([int(id),
                         float(cost.replace(',', '')),
                         float(depr_res.replace(',', ''))])

df = pd.DataFrame(data, columns=['id', 'cost', 'depr_res'])

生成的框架看起来像

         id      cost  depr_res
0    123123  11448.08  11448.08
1    123124  23950.12  23950.12
2    123125  23950.12  23950.12
3    123126  11448.08  11448.08
4   1353000  17001.08  14830.16
5   1353001  17001.08  14830.16
6   1353002  17001.08  11688.19
7   1353003  17001.08  14566.06
8   1353004  17001.08   9194.67
9   1353005  17001.08  14830.16
10  1353006  17001.08  14830.16
...

这绝不是一个成熟的解决方案(!),但可能是一个开始工作的起点。

【讨论】:

  • 伙计,你是魔术师。我在我的生产数据上使用了 10k+ 行,它匹配完美的报告。不会撒谎,我不明白你在那里做了什么,但我会逐行分析。谢谢!
  • @gervith 很高兴我能帮上忙。如果您对正则表达式的工作方式感兴趣,请查看here。
  • python 正则表达式的出色使用!谢谢你的例子。这是一个很好的参考,我认为它与答案很好:docs.python.org/3/howto/regex.html
猜你喜欢
  • 2018-06-04
  • 2020-09-10
  • 2021-04-09
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 2019-04-09
  • 2010-12-31
  • 2010-10-31
相关资源
最近更新 更多