Pyspark/Python:将包含多行文件的csv文件转换为单行文件

2024-10-06 18:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个csv文件,它有这样的多行记录

id1,id2,id3,id4,id5,id6,id7
1,2,3,4,5,6,7

1,2,3,4

,5,6,

7

1,2

3,4

,5,6,


7

我想更改文件,如下所示-

id1,id2,id3,id4,id5,id6,id7
1,2,3,4,5,6,7
1,2,3,4,5,6,7
1,2,3,4,5,6,7

我知道pyspark可以使用multiline:True选项读取此类文件,但我想将此文件转换为单线行,这是业务用例。我该怎么做呢。要使用的技术可以是Pyspark,也可以是Python(Pandas)。提前谢谢


Tags: 文件csvtrue选项记录pysparkmultilineid3
1条回答
网友
1楼 · 发布于 2024-10-06 18:23:59

你有这样的想法吗

import re

items  = re.findall("[^ ,\n]+", """id1,id2,id3,id4,id5,id6,id7
1,2,3,4,5,6,7

1,2,3,4

,5,6,

7

1,2

3,4

,5,6,


7""")

rows = [items[i:i+7] for i in range(0,len(items),7)]
pd.DataFrame(rows[1:], columns=rows[0])

输出:

  id1 id2 id3 id4 id5 id6 id7
0   1   2   3   4   5   6   7
1   1   2   3   4   5   6   7
2   1   2   3   4   5   6   7

由于已请求,此处是第2部分的无循环版本:

rows = np.array(items).reshape(len(items)//7,7)
pd.DataFrame(rows[1:], columns=rows[0])

我使用jupter的%%timeit测试了它是否真的节省了时间:结果是:

  • 正则表达式部分的长度为6.66µs±43.8 ns
  • 然后将其转换为数据帧的旧循环部分需要759µs±2.81µs
  • 新的numpy版本需要149µs±4.82µs

相关问题 更多 >