如何每隔一行读取 CSV 文件

Posted

技术标签:

【中文标题】如何每隔一行读取 CSV 文件【英文标题】:How to read a CSV file every other row 【发布时间】:2019-10-28 13:56:41 【问题描述】:

如何从 CSV 文件中获取每 2 行的数据?

例如,如果我有一个看起来像这样的文件

  0   1
0 23  34
1 45  45
2 78  16
3 110 78
4 48  14
5 76  23
6 55  33
7 12  13
8 18  76

如何迭代并提取每第二行以获得类似的内容并附加到新的数据帧中?

0 23  34
2 78  16
4 48  14
6 55  33
8 18  76

谢谢!

【问题讨论】:

【参考方案1】:

使用read_csvskiprows参数:

保持偶数行:

pd.read_csv('file.csv', skiprows=lambda x: (x != 0) and not x % 2)

保留奇数行:

pd.read_csv('file.csv', skiprows=lambda x: x % 2)

请注意,标头包含在skiprows 中,这就是为什么在偶数示例中需要x != 0

例子:

In [1]: import pandas as pd
   ...: from io import StringIO
   ...:
   ...: data = """A,B
   ...: a,1
   ...: b,2
   ...: c,3
   ...: d,4
   ...: e,5
   ...: """

In [2]: pd.read_csv(StringIO(data))
Out[2]:
   A  B
0  a  1
1  b  2
2  c  3
3  d  4
4  e  5

In [3]: pd.read_csv(StringIO(data), skiprows=lambda x: (x != 0) and not x % 2)
Out[3]:
   A  B
0  a  1
1  c  3
2  e  5

In [4]: pd.read_csv(StringIO(data), skiprows=lambda x: x % 2)
Out[4]:
   A  B
0  b  2
1  d  4

【讨论】:

【参考方案2】:

您可以使用numpy 将它们全部读入内存并每隔一行存储一次:

import numpy as np
import pandas as pd

data = np.loadtxt(filename)
data = pd.DataFrame(data[::2])

最后一位,[::2],意思是“每隔一个元素”。

【讨论】:

【参考方案3】:

就个人而言,我认为最简单的答案(如果您只想要偶数行)是:

import pandas as pd
df = pd.read_csv('csv_file.csv')
rows_we_want = [row for i,row in enumerate(df.index) if not i % 2]
df_new = df.loc[rows_we_want]

enumerate() 是 Python 中一个强大的函数,“if not i % 2”仅在行号 (i) 为偶数时为 True。如果您想要奇数行,则可以删除“不”。我认为这种方法比逐行读取文件更容易,尽管如果您的文件非常大,则可能存在可伸缩性问题。希望这会有所帮助

【讨论】:

以上是关于如何每隔一行读取 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

Python如何读取csv文件某一列的每一行数据,并判断该数值是不是满足条件?

如何从流中读取 CSV 文件并在写入时处理每一行?

在 Scala 中,如何读取第一行有标题的简单 CSV 文件?

如何在 Pig 中读取 csv 文件中的下一行

2018-01-06 python读取csv某一行

如何知道python中一行CSV文件的字节位置?