【问题标题】:Pandas read_csv drop all lines after EOFPandas read_csv 在 EOF 之后删除所有行
【发布时间】:2020-09-07 14:10:05
【问题描述】:

我正在使用通常的 pd.read_csv 将 csv 文件读入 pandas。这一切正常。但是,我的大多数 csv 文件末尾都有一行,其中“#EOD”作为第一列值,表示该表的最后一行。在此之后可能会有更多行包含所有“nan”值。

pd.read_csv('test.csv')

Out[1]: 
     A    B      C   D
0   C1    A    0.5   9
1   C2    A    0.2   1
2   C3    A    0.3   7
3   C4    B    0.2   4
4   #EOD  None nan   nan
5   *     None nan   nan

在读取 csv 文件时,如何删除“#EOD”行之后的所有行,包括“#EOD”行?我不知道它在“#EOD”之后是只有一行还是几行,它可能因文件而异。

【问题讨论】:

  • 您在 csv 文件中是否还有其他 nan 值。我认为简单的df.dropna(inplace=True) 应该可以工作,因为在包含#EOD 的行中有/将会有nan 值。
  • 是的,可以有很多 nan 值,所以不幸的是,这不起作用

标签: python pandas


【解决方案1】:

试试这个 - 先找到“#EOD”的索引,然后再切片。

df[:(df.query("A=='#EOD'")).index.item()]
    A  B    C    D
0  C1  A  0.5  9.0
1  C2  A  0.2  1.0
2  C3  A  0.3  7.0
3  C4  B  0.2  4.0

或者一般使用iloc

df[: df[df.iloc[:,0]=="#EOD"].index[0]]

【讨论】:

  • 谢谢。我正在寻找一种更通用的方式,因为第一列名称可能不同。有什么想法吗?
【解决方案2】:

获取最后想要的行的索引并在切片中使用它。 (.loc 切片包含结束标签,与 python 列表切片不同)

idx = df.loc[df.iloc[:, 0].shift(-1).eq('#EOD')].index[0]
df.loc[:idx, :]

【讨论】:

  • 谢谢。我正在寻找一种更通用的方式,因为第一列名称可能不同。有什么想法吗?
  • @RichieV 使用iloc 而不是loc 这样你就可以避免shift 然后 - df.iloc[:idx, :]
猜你喜欢
  • 2016-09-27
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2017-06-19
相关资源
最近更新 更多