【问题标题】:Pandas magic with ugly CSV format丑陋的 CSV 格式的 Pandas 魔法
【发布时间】: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


【解决方案1】:

使用,这里有一种方法可以解决这个问题(给你一般的逻辑).

df = pd.read_csv("file.csv", sep="/", header=None)
​
m1 = df[0].str.contains("TIMESTEP")
m2 = df[0].str.contains("Variables").shift().fillna(False)
​
conds, vals = [m1, m2], ["TO_SKIP", "DATA"]
​    ​
out = (
        df
          .assign(flag= pd.Series(np.select(conds, vals, None)).ffill())
          .pivot(columns="flag", values=0)
          ["DATA"].dropna()
          .str.split(expand=True)
          .set_axis(["Index", "a", "b", "c", "d", "e"], axis=1)
          .reset_index(drop=True)
        )
​

输出 :

print(out)

  Index     a     b     c     d     e
0     1    a1    b1    c1    d1    e1
1     2    a2    b2    c2    d2    e2
2   491  a491  b491  c491  d491  e491
3     1    a1    b1    c1    d1    e1
4     2    a2    b2    c2    d2    e2
5   491  a491  b491  c491  d491  e491

免责声明:此方法对于大文件可能效率不高。

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 2011-08-11
    • 2019-08-18
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2014-06-28
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多