gpt4 book ai didi

python - 包含在括号中偶尔带有逗号的列的 CSV 文件会崩溃 pandas.read_csv

转载 作者:行者123 更新时间:2023-11-28 21:32:53 25 4
gpt4 key购买 nike

我需要编写一个函数来解析一个非常大的 .csv 文件。不幸的是,制作 csv 文件的人没有使用很好的分隔符,因为其中一个文本列偶尔会使用分隔符(我对此无法控制)。 csv 文件在文本周围没有引号,即有问题的行看起来像这样:

colAVal, (colBVal_1, colBVal_2), colCVal

我应该注意,对于所有有问题的行,B 列的值是标准的,因为它始终是 (colBVal_1, colBVal_2)

因为大多数行没有这个问题,pandas.read_csv 需要 3 列,当它遇到这些有问题的行之一时崩溃。

因为逗号在括号中,我想不出解决这个问题的方法,使用 read_csv 中的 quotechar 参数。我想避免编写自己的 read_csv 函数来逐行处理,并尽可能手动解决此问题。理想情况下,我正在寻找一种方法来告诉 read_csv 当它遇到 (colBVal_1, colBVal_2) 时,它应该自动将其分配给 colB 或者让 read_csv 将数据分成 2 个数据帧:一个有 3 列,一个有 4 列,我可以手动合并在一起。

最佳答案

如评论中所述,您可以使用“损坏的”csv 行制定语法,并将生成的输出提供给 pandas DataFrame。
以下肯定可以优化,但可能会给您一个想法:

from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
import pandas as pd

broken_garbage = """
1, (2, 3), 4
colAVal, (colBVal_1, colBVal_2), colCVal,
this, one, right
234,(123,456),789
"""

grammar = Grammar(
r"""
content = garbage? line+
line = entry+ newline?
entry = value sep?
value = word / (lpar word sep word rpar)

lpar = "("
rpar = ")"
word = ~"\w+"
sep = ws? "," ws?

ws = ~"[\t ]+"
newline = ~"[\r\n]+"
garbage = (ws / newline)+
"""
)

class BrokenVisitor(NodeVisitor):
def generic_visit(self, node, visited_children):
return visited_children or node

def visit_value(self, node, visited_children):
child = visited_children[0]
if isinstance(child, list):
_, value1, _, value2, _ = child
return (value1.text, value2.text)
else:
return child.text

def visit_entry(self, node, visited_children):
values, _ = visited_children
return values

def visit_line(self, node, visited_children):
content = visited_children[0]
return [item for item in content]

def visit_content(self, node, visited_children):
return visited_children[1]

tree = grammar.parse(broken_garbage)

broken = BrokenVisitor()
values = broken.visit(tree)

df = pd.DataFrame(values, columns=["one", "two", "three"])
print(df)


这产生

       one                     two    three
0 1 (2, 3) 4
1 colAVal (colBVal_1, colBVal_2) colCVal
2 this one right
3 234 (123, 456) 789


查看反射(reflect)您的结构的语法。 BrokenVisitor 类访问每个语法 block 并将行作为列表返回。然后将此结果输入 pandas.DataFrame 构造函数。

或者,您可以使用支持 \K 的较新的 regex module 并将括号中的所有逗号替换为另一个字符:

\([^,()]+\K,

Python 中,这可能是:

import regex as re

rx = re.sub(r'\([^,()]+\K,')
new_string = rx.sub('@', old_string)

之后,您可以将新字符串直接输入到 pandas.read_csv() 中。
参见 a demo on regex101.com

关于python - 包含在括号中偶尔带有逗号的列的 CSV 文件会崩溃 pandas.read_csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55580933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com