当前位置: 首页 > 知识库问答 >
问题:

如何使用Pandas从.txt文件解析表

乌修筠
2023-03-14
aaa
bbb
ccc

=====================
A   B   C   D   E   F
=====================
1   2   3   4   5   6
7   8   9   1   2   3
4   5   6   7   8   9
1   2   3   4   5   6
---------------------

=====================
G     H     I     J
=====================
1           3     4
5           6     7
---------------------

=====================
K    L    M    N    O
=====================
1              2    3
4    5              6
7    8         9
---------------------

xxx
yyy
zzz
    null

我现在的代码:

import pandas as pd
import itertools

df = pd.read_csv("xxx.txt", sep="\n", header=None)

# delimiters for header and end-of-table

h_dl = "=" * 21
r_dl = "-" * 21

for i in range(len(df.index)-2):

    # if loop to find lines which are table headers & convert to list    

    if (df.iloc[i].any() == h_dl) & (df.iloc[i+2].any() == h_dl):

        h = df.iloc[i+1].str.split().tolist()
        h = list(itertools.chain(*h))


        # while loop to find lines which are table rows & append to one list

        x = 3
        r = []

        while True:

            if df.iloc[i+x].any() == r_dl:
                break

            r.append(df.iloc[i+x].str.split().tolist())
            x += 1

        r = list(itertools.chain(*r))

        # create pandas dataframe with header and rows obtained above
        t = pd.DataFrame(data=r, columns=h)

此代码返回断言错误:传递了14列,传递的数据有15列。我知道这是因为对于表行,我使用的是.str.split(),默认情况下它在空格上拆分。由于有些列缺少值,因此对于第二个和htird表,表头中的元素数和表行中的元素数不匹配。我正在努力解决这个问题,因为表示缺失值的空格字符的数量对于每个表来说是不同的。

我的问题是:是否有一种方法可以解释某些列中丢失的值,以便在丢失值为null或NaN的情况下获得一个DataFrame作为输出?

共有1个答案

杨建章
2023-03-14

通过使用Victor Ruiz方法,我添加了if选项来处理不同的头大小。

=^..^=

代码中的说明:

import re
import pandas as pd
import itertools

df = pd.read_csv("stack.txt", sep="\n", header=None)

# delimiters for header and end-of-table

h_dl = "=" * 21
r_dl = "-" * 21

for i in range(len(df.index)-2):

    # if loop to find lines which are table headers & convert to list
    if (df.iloc[i].any() == h_dl) & (df.iloc[i+2].any() == h_dl):

        h = df.iloc[i+1].str.split().tolist()
        h = list(itertools.chain(*h))

        # get header string
        head = df.iloc[i+1].to_string()
        # get space distance in header
        space_range = 0
        for result in re.findall('([ ]*)', head):
            if len(result) > 0:
                space_range = len(result)

        x = 3
        r = []
        while True:
            if df.iloc[i+x].any() == r_dl:
                break

            # strip line
            line = df.iloc[i+x].to_string()[5::]

            # collect items based on elements distance
            items = []
            for result in re.finditer('(\d+)([ ]*)', line):
                item, delimiter = result.groups()
                items.append(item)
                if len(delimiter) > space_range*2+1:
                    items.append('NaN')
                    items.append('NaN')
                if len(delimiter) < space_range*2+2 and len(delimiter) > space_range:
                    items.append('NaN')
            r.append([items])

            x += 1

        r = list(itertools.chain(*r))

        # create pandas dataframe with header and rows obtained above
        t = pd.DataFrame(data=r, columns=h)
   A  B  C  D  E  F
0  1  2  3  4  5  6
1  7  8  9  1  2  3
2  4  5  6  7  8  9
3  1  2  3  4  5  6

   G    H  I  J
0  1  NaN  3  4
1  5  NaN  6  7

   K    L    M    N     O
0  1  NaN  NaN    2     3
1  4    5  NaN  NaN     6
2  7    8  NaN    9  None
 类似资料:
  • 问题内容: 我有一个.txt文件,其中包含以下详细信息: 我想做的是解析此广告,使值以更易读的格式(如果可能)转换为数组。 谢谢 问题答案: 您可以这样轻松地做到这一点 首先,您可以使用函数打开文本文件,然后使用函数在换行符上剪切字符串。这样,您将获得一个数组,其中所有行都分开。然后使用该函数可以删除第一行,因为它是标题。 获取行之后,您可以遍历数组并将所有信息放入名为的新数组中。从零行开始,您将

  • 问题内容: 我目前有一个CSV文件,当在Excel中打开该文件时,共有5列。仅A和C列对我而言没有任何意义,其余列中的数据无关紧要。 从第8行开始,然后以7的倍数工作(即第8、15、22、29、36行等),我希望使用Python 2.7创建一个字典,其中包含来自这些字段的信息。A列中的数据将是密钥(6位整数),C列中的数据将是密钥的相应值。我试图在下面强调这一点,但格式不是最好的: 如上所述,我正

  • 给定此方法: 忽略变量名,该方法所做的是将加密代码的数据写入名为EncryptedMessage的项目文件夹内生成的txt文件中。txt。 我需要的是一种方法来保存txt文件,而不是在项目文件夹中,保存在用户在运行期间指定的位置(打开另存为对话框)。我认为这可以由JFilechooser完成,但我无法让它工作。

  • 问题内容: 我有一个非常简单的JSON,其中包含产品评论,例如: 我想使用GSON将其读入我的Java应用程序中。我建立了一个类来保存每个评论的结果: 要读取JSON文件,我的代码是: 使用此代码,我只能在JSON中检索第一个评论,所以我的问题是:如何遍历所有读者并获得下一个评论?我不需要将评论存储在列表中,只需要访问对象一次。任何帮助都超过了欢迎。 问题答案: 您必须获取列表中的全部数据,然后再

  • 问题内容: 假设我有一个包含以下内容的文件: 如何通过PHP解析内容? 问题答案: 只需使用该功能即可解析CSV文件

  • 问题内容: 我试图使用PHP解析JSON文件。但是我现在被困住了。 这是我的JSON文件的内容: 到目前为止,这是我尝试过的: 但是,因为我不知道的名字(例如,)和所有可用键和值(如,)事前,我想我需要创建一些foreach循环。 我希望为此举一个例子。 问题答案: 要遍历多维数组,可以使用RecursiveArrayIterator 输出: