【发布时间】:2023-02-01 19:55:00
【问题描述】:
一个古老的原子模拟软件正在生成非常难看的 CSV 文件,我想将其导入到 pandas dataframe 中。格式如下所示:
TIMESTEP
0
Information line 1
Information line 2
Information line 3
Information line 4
Variables: Index a b c d e
1 a1 b1 c1 d1 e1
2 a2 b2 c2 d2 e2
...
491 a491 b491 c491 d491 e491
TIMESTEP
1
Information line 1
Information line 2
Information line 3
Information line 4
Variables: Index a b c d e
1 a1 b1 c1 d1 e1
2 a2 b2 c2 d2 e2
...
491 a491 b491 c491 d491 e491
...
...
TIMESTEP
1002
...
基本上它是一个带有迭代次数信息的重复标题。对我来说,将其转换为 pandas 的最简单方法似乎是使用变量 a b c d e df 并向其添加一个新的列“TAMPSTEP”,因此这将是一个不错的 2D df。或者可以是多索引数组 Timestep 1 -> internal_df['a','b','c','d','e']
可以删除信息行。
最终结果理想情况下如下所示:
Index a b c d e TIMESTAMP
1 a1 b1 c1 d1 e1 0
...
491 a491 b491 c491 d491 e491 1002
您会建议一个字符串格式化脚本(示例将不胜感激),或者也许具有一组智能设置的 Pandas read_csv 可以开箱即用?
干杯
【问题讨论】:
-
你的样子应该如何漂亮的二维 df?你能把它添加到你的问题中吗?
-
为什么1002和TIMESTEP在同一行?
-
假设您不需要表外的任何数据,您可以尝试
read_table或什至read_csv并丢弃“坏”行,例如那些有太多 NaN 的行,其第一个值不是数字等。如果数字标题和行的数量是固定的,您可以将 lambda 传递给skip_rows,它按索引拒绝行。 -
从任何定义来看,这都不是 CSV。问题不在于 TIMESTEP,而是表格之外的任何东西都不是表格,不能那样处理。即使第一行只有一个
TIMESTEP的单个部分,您仍然无法使用read_csv并在其中获取TIMESTEP -
它看起来像是基于行的记录和空格分隔值之间的混合。使用 awk 和二维数组进行转换可能相对简单。每次看到
TIMESTEP时更新索引。然后处理与实际数据模式匹配的行 (1 a1 b1..)。最后打印出数组。当然,您可以使用 Python 做同样的事情。
标签: python pandas csv string-formatting