【问题标题】:Python incorrect indexing of pandas.core.frame.Dataframe / how to delete a comma on the end of each row of a csv file?python对pandas.core.frame.Dataframe的索引不正确/如何删除csv文件每行末尾的逗号?
【发布时间】:2020-04-09 11:42:18
【问题描述】:

我正在处理 25,000 行的多个 csv 数据文件,并且应该是 2 列。这些数据文件来自我用来进行数据测量的示波器。文件如下所示:

错误的文件

TIME,CH1  
-2.500000e-01,2.00e-03,  
-2.499800e-01,2.00e-03,  
-2.499600e-01,0.00e+00,  

我编写了代码来处理我使用以前的示波器采集的数据,它工作得很好。该数据如下所示:

好文件

TIME,CH1,CH1 Peak Detect  
-1.8720e-01,-0.001,-0.155  
-1.8712e-01,0.005,0.143  
-1.8705e-01,0.001,-0.151  

我只使用前 2 列的数据。除了额外的列之外,我可以看到两个数据文件之间的唯一区别是,我遇到问题的那个文件的每一行都以逗号结尾,而另一个则没有。

为了从文件中获取数据,我一直在使用以下方法来访问和处理每列中的数据:

r0 = pandas.read_csv("BADFILE.csv")
t0 = r0["TIME"]
v0 = r0["CH1"]

在哪里

type(r0): pandas.core.frame.DataFrame
type(t0): pandas.core.series.Series

当我在bad file的python环境中查看r0时,显示为

           TIME  CH1
-0.25000  0.008  NaN
-0.24998  0.000  NaN
-0.24996 -0.002  NaN

我认为这表明索引存在问题,因为 好文件 将 r0 显示为

         TIME    CH1  CH1 Peak Detect
0    -0.19200 -0.001           -0.021
1    -0.19192 -0.001            0.021
2    -0.19185 -0.001           -0.023

我不确定如何解决这个索引问题。我已经探索过了

  • 想办法删除坏文件行中的最后一个字符(找不到)
  • 重命名坐标区并创建新索引(可能很有希望,但我不明白如何实现)
  • 在每个文件的标题行中添加逗号(无效)

以我的经验水平,我很难找到和应用可以完成这些事情的解决方案,并将此数据文件制作成我可以使用的形式。

我发现了一个伪劣的解决方法,它涉及手动将每个 csv 文件保存为 Excel 文件并使用 pandas 将它们导入为 excel 文件。这会导致我从旧的 csv 文件中获得正确的索引。但是,我经常处理大量文件,所以这不是最实用的解决方案。

如果您对如何解决此问题有任何想法,我们将不胜感激。

【问题讨论】:

  • 如果您要遍历 CSV 的每一行,您可以使用 row[:-1] 删除结尾逗号,但是如果不是每一行都以逗号结尾,则需要修改

标签: python pandas csv dataframe indexing


【解决方案1】:

您可以打开文件并将逗号行右移到内存中的StringIO 缓冲区中:

from io import StringIO

with open("test.csv", "r") as f, StringIO() as buff:
    for line in f:
        buff.write(line.strip().rstrip(',') + "\n")
    buff.seek(0)
    df = pd.read_csv(buff)

结果:

      TIME    CH1
0 -0.25000  0.002
1 -0.24998  0.002
2 -0.24996  0.000

编辑:未经测试的 Python 2 版本:

from io import BytesIO

with open("test.csv", "r") as f, BytesIO() as buff:
    for line in f:
        buff.write(bytes(line.strip().rstrip(',') + "\n"))
    buff.seek(0)
    df = pd.read_csv(buff)

【讨论】:

  • 感谢您的意见!当我尝试它时,我在“buff.write(line.strip().rstrip(',') + "\n") 行上得到“unicode argument expected, got 'str'”作为错误。对此有什么想法吗?
  • @KatherineW 你在用 Python 2 吗?
  • 是的,我相信我使用的是 python 2.7。您使用的是新版本吗?
  • @KatherineW 我不是 PMende,但您使用 Python 2 有什么特别的原因(遗留代码库、专用库...)?
  • @KatherineW 如果你切换到 Python 3,它应该可以工作,如果你被锁定在使用 Python 2,你将需要使用另一个使用 BytesIO 的解决方案。我在上面的编辑中添加了我对 Python 2 解决方案的最佳猜测,但我已经多年没有使用 Python 2。如果可以的话,我强烈建议您迁移到 Python 3。如果我的解决方案不起作用,您可以尝试自己调试,然后再问另一个问题?
猜你喜欢
  • 2017-06-29
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多