【问题标题】:CSV reader won't read correct columnCSV 阅读器无法读取正确的列
【发布时间】:2020-11-13 12:40:16
【问题描述】:

再次对不起。下面是我尝试读取的数据示例。

nhy, time, dt=    0  0.0000D+00  1.9416D-02
nhy, time, dt=    1  1.9400D-02  2.2416D-02
nhy, time, dt=    2  4.3800D-02  3.0416D-02
nhy, time, dt=    3  7.3540D-02  4.8416D-02
nhy, time, dt=    4  1.3350D-01  6.9416D-02

我正在尝试使用此代码提取 dt 列,

dt50 = []

file = "timestep.log"
col_list = ["dt"]
data = pd.read_csv(file, sep= '\s+|\t+|\s+\t+|\t+\s', skiprows = (30), usecols = col_list

dt50.extend(data['dt'])

print(dt50)

这一切都只返回 dt 列而不是实际值列。我猜这与我声明我想要的列有关,但不确定我哪里出错了。

很抱歉,由于我缺乏编码能力而打扰大家。

【问题讨论】:

  • 您确定您的csv 文件格式正确吗?当您尝试运行它时,您给出的示例会引发错误,因为没有指定列。您的列应该是:nhytimedt
  • 生成的日志文件中没有and。上面有一些信息,因此为什么我添加了“skiprows”命令,但我使用的数据是如上所示的输出。
  • 是的,但是,当读取该数据时,您的代码会抛出 KeyError: "dt"。原始文件中有标题吗?当您说“...仅返回 dt 列而不是实际值列”时。你能提供一个你想要的例子吗?
  • 所以不是打印数据中的内容是 1.9416D-02、2.2416D-02、3.0416D-02 等的第三个数字列。它只是打印出 dt、dt、dt 等。所以如果你明白我的意思,它会读取列名而不是实际值的 dt。
  • 是的,这是有道理的。我无法重现您获得的输出,因为您共享的代码会抛出 KeyError: "dt",因为没有“dt”列。您是否有机会与我们分享整个文件?

标签: python-3.x pandas csv


【解决方案1】:

您只会在输出中获得dt,因为它将第一行数据解释为列。因此,输出数据如下所示:

   nhy, time, dt =   0  0.0000D+00  1.9416D-02
0  nhy, time, dt =   1  1.9416D-02  2.4464D-02
1  nhy, time, dt =   2  4.3881D-02  3.0825D-02
2  nhy, time, dt =   3  7.4706D-02  3.8840D-02
3  nhy, time, dt =   4  1.1355D-01  4.8938D-02
4  nhy, time, dt =   5  1.6248D-01  6.1662D-02
5  nhy, time, dt =   6  2.2415D-01  7.7694D-02
6  nhy, time, dt =   7  3.0184D-01  9.7895D-02
7  nhy, time, dt =   8  3.9974D-01  1.2335D-01
8  nhy, time, dt =   9  5.2308D-01  1.5542D-01
9  nhy, time, dt =  10  6.7850D-01  1.9583D-01

如您所见,这些列是:nhy,time,dt=00.0000D+001.9416D-02。因此,当您尝试通过说出data["dt"] 来访问这些值时,位于"dt" 列下的唯一数据就是"dt" 的其他字符串值。

这里的问题是您的正则表达式模式。您当前的正则表达式模式检查它具有任意数量的空格和/或制表符的实例。因为nhy, time, dt = 都由空格和/或制表符分隔,所以它将为每个由空格分隔的元素创建列。让我们用\s{2,} 替换这个正则表达式,它将检查两个或多个空格(实际值都被两个空格唯一分隔)。然后我们可以使用names=["nhy", "time", "dt"] 为列分配自己的名称。您的 read_csv 行将如下所示:

file = "timestep.log"
data = pd.read_csv(file, sep="\s{2,}", names=["nhy", "time", "dt"])

这给了我们:

                 nhy        time          dt
nhy, time, dt =    0  0.0000D+00  1.9416D-02
nhy, time, dt =    1  1.9416D-02  2.4464D-02
nhy, time, dt =    2  4.3881D-02  3.0825D-02
nhy, time, dt =    3  7.4706D-02  3.8840D-02
nhy, time, dt =    4  1.1355D-01  4.8938D-02
nhy, time, dt =    5  1.6248D-01  6.1662D-02
nhy, time, dt =    6  2.2415D-01  7.7694D-02
nhy, time, dt =    7  3.0184D-01  9.7895D-02
nhy, time, dt =    8  3.9974D-01  1.2335D-01
nhy, time, dt =    9  5.2308D-01  1.5542D-01

现在我们在各自的列中拥有所有数据。我们要做的就是重置索引,目前是nhy, time, dt =

data.reset_index(drop=True, inplace=True)

这给了我们:

    nhy        time          dt
0     0  0.0000D+00  1.9416D-02
1     1  1.9416D-02  2.4464D-02
2     2  4.3881D-02  3.0825D-02
3     3  7.4706D-02  3.8840D-02
4     4  1.1355D-01  4.8938D-02
5     5  1.6248D-01  6.1662D-02
6     6  2.2415D-01  7.7694D-02
7     7  3.0184D-01  9.7895D-02
8     8  3.9974D-01  1.2335D-01
9     9  5.2308D-01  1.5542D-01

现在剩下要做的就是扩展您现有的列表:

dt50.extend(data["dt"].tolist())

这给了我们想要的输出:

['1.9416D-02', '2.4464D-02', '3.0825D-02', '3.8840D-02', '4.8938D-02', '6.1662D-02', '7.7694D-02', '9.7895D-02', '1.2335D-01', '1.5542D-01']

【讨论】:

  • 非常感谢这对我很有帮助!
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 2019-11-13
  • 2018-02-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多