从大而丑陋的输入文本文件到非常小的数据帧

2024-05-29 03:34:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的输入文本文件(>;10000行),您可以在下面找到其中的摘录:

$
SPC           10  507901  123456     0.0
SPC           10  507902  123456     0.0
SPC           10  507903  123456     0.0
$
GRID      100001  100000 8.17119-0.68585 1.92194  100010
GRID      100002  100000 7.73198-0.94529 1.73439  100010
GRID      100003  100000 7.28772-0.97244 1.54514  100010
GRID      100004  100000 6.76982-0.71715 1.32471  100010

我试图提取所有从网格开始的行,并将它们放在一个由7列组成的数据框架中。每列由8个字符定义(感谢Nastran)。例如,对于上面显示的第一条网格线,应将其划分为:

|GRID    |  100001|  100000| 8.17119|-0.68585| 1.92194|  100010|

我的代码:

model_without_grid = list()
model_just_grid = list()

with open('MODELE1', encoding='utf-8') as in_file:
    for line in in_file:
        if line.startswith('GRID') :
            model_just_grid.append(line)
        else :
            model_without_grid.append(line)

给我一个很好的列表,列出了所有以网格开头的行。 现在我想使用split函数将每一行划分为一个数据帧的多个列

通过使用此问题: Convert a tab- and newline-delimited string to pandas dataframe

我试过:

grid_pd = pd.DataFrame([x.split('        ') for x in model_just_grid],columns=list('1234567'))

但会出现以下错误:

ValueError: 7 columns passed, passed data had 1 columns

当然,如果我去掉columns部分,我会得到一个数据框,其中一列与我的列表完全相同

然后我试着:

aaa  = grid_pd[0].str.split('.{8}')

aaa  = grid_pd[0].str.extractall('(.{8})')

但是第一个创建一个空数据帧,第二个创建一个多索引数据帧。通过解开它

 aaa = aaa.unstack()

它确实给了我数据帧,但必须有一个更干净的解决方案

有人知道如何解决我的问题吗?操作似乎很简单,但我想不出一个干净的方法来继续

提前感谢您的帮助


Tags: columns数据in网格modellinelistgrid
1条回答
网友
1楼 · 发布于 2024-05-29 03:34:20

在创建数据帧之前,您希望将每行拆分为7个大小相等的段。这可以通过在所有相关字符串上循环并根据条件拆分它们来实现

例如:

chunks, chunk_size = 56, 8

rows = [[x[i:i+chunk_size] for i in range(0, chunks, chunk_size)] for x in model_without_grid]
df = pd.DataFrame(rows)

结果:

       0         1       2        3        4          5      6
0   GRID    100001  100000  8.17119 -0.68585    1.92194 100010
1   GRID    100002  100000  7.73198 -0.94529    1.73439 100010
2   GRID    100003  100000  7.28772 -0.97244    1.54514 100010
3   GRID    100004  100000  6.76982 -0.71715    1.32471 100010

相关问题 更多 >

    热门问题