【问题标题】:How to import a non-structured flat file into Python using pandas?如何使用 pandas 将非结构化平面文件导入 Python?
【发布时间】:2020-04-30 07:49:20
【问题描述】:

我正在尝试将 .db 文件导入 pandas。文件排序如下:


Person 1

Characteristic 1: Value 

Characteristic 2: Value


Person 2

Characteristic 1: Value

等等


我想将数据导入 pandas,并在列中将人员作为具有不同特征的行,如下所示:


Person Characteristic 1 Characteristic 2

Person 1 Value Value

Person 2 Value Value

等等


我试图环顾四周,但只找到了导入普通平面文件的建议,其中在导入之前已经在文件中指定了列。

任何帮助将不胜感激。

【问题讨论】:

  • 你知道文件分隔符吗?还是分隔符是空格?
  • 欢迎来到 SO!您的输入是否与您的示例完全一样,或者这只是一个插图?在这种情况下,细节可能很重要(如空格、冒号的放置等)。您可以使您的示例越“真实”(同时保持其小巧和包含),答案就越有用。
  • 该文件类似于上面的示例。会有一个名字,然后在那个人的某些特征之下。然后是下一个人,下一个,以此类推。我真的不知道分隔符。看起来它只是在说明特征值后的空白,它转到下一行并说明下一个
  • 您是在文本编辑器中打开它的吗?绝对没有逗号、制表符或管道分隔符?那么我认为在将 python CSV 模块填充到 sql 之前最好使用正则表达式方法。
  • 在记事本中看起来完全一样,是的。您介意详细说明您的方法吗?我不确定我知道该怎么做

标签: python pandas python-import flat-file flat


【解决方案1】:

假设:

  • 输入是面向行的文本文件
  • 空行将被忽略
  • 不包含冒号的行(':') 声明一条新记录
  • 包含冒号的行声明当前记录的属性

这不是 pandas 可以直接处理的文件格式,但 Python 可以轻松构建记录列表,稍后将提供数据帧:

records = []
current = None
fieldnames = ['Person']

with open('inputfile') as file:
    for line in file:
        line = line.strip()
        if len(line) != 0:            # ignore empty lines
            if ':' in line:           # a characteristic line
                attr, value = line.split(':', 1)
                attr = attr.strip()
                current[attr] = value.strip()
                if not attr in fieldnames:
                    fieldnames.append(attr)
            else:                                      # a person line
                current = {'Person': line}
                records.append(current)

df = pd.DataFrame(columns = fieldnames, data = records)

使用您的示例数据,它按预期提供:

     Person Characteristic 1 Characteristic 2
0  Person 1            Value            Value
1  Person 2            Value              NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2023-01-30
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多