Python 熊猫们读着书。显示为字符串的行终止符

Python 熊猫们读着书。显示为字符串的行终止符,python,pandas,newline,Python,Pandas,Newline,我有一个txt文件需要加载到数据帧中,但行终止符显示在一些字符串值中。这会导致不需要的输出 以下是一些数据的示例以及我如何加载这些数据: data = ''' col1|col2|col3 vala1|vala2|vala3 valb1|val b2|valb3 ''' df = pd.read_csv(io.StringIO(data), sep='|') 以及不期望的输出: 这是期望的输出: 数据来自第三方,我无法控制他们如何提供给我们。您可以尝试修复数据,但这在很大程度上取决于您的

我有一个txt文件需要加载到数据帧中,但行终止符显示在一些字符串值中。这会导致不需要的输出

以下是一些数据的示例以及我如何加载这些数据:

data = '''
col1|col2|col3
vala1|vala2|vala3
valb1|val
b2|valb3
'''

df = pd.read_csv(io.StringIO(data), sep='|')
以及不期望的输出:

这是期望的输出:

数据来自第三方,我无法控制他们如何提供给我们。

您可以尝试修复数据,但这在很大程度上取决于您的输入(是否有转义的分隔符?等等)

试试这个例子:

data = '''
col1|col2|col3
vala1|vala2|vala3
valb1|val
b2|valb3
'''

import pandas as pd
from itertools import groupby
from io import StringIO

def repair(data, num_cols=3):
    new_data = []
    for v, g in groupby(data.strip().splitlines(), lambda k: len(k.split('|')) == num_cols):
        if v:
            new_data.extend(g)
        else:
            new_data.append(''.join(g))
    return '\n'.join(new_data)

df = pd.read_csv(StringIO(repair(data, 3)), sep='|')
print(df)
印刷品:

    col1   col2   col3
0  vala1  vala2  vala3
1  valb1  valb2  valb3
您可以尝试修复数据,但这在很大程度上取决于您的输入(是否有转义的分隔符?等等)

试试这个例子:

data = '''
col1|col2|col3
vala1|vala2|vala3
valb1|val
b2|valb3
'''

import pandas as pd
from itertools import groupby
from io import StringIO

def repair(data, num_cols=3):
    new_data = []
    for v, g in groupby(data.strip().splitlines(), lambda k: len(k.split('|')) == num_cols):
        if v:
            new_data.extend(g)
        else:
            new_data.append(''.join(g))
    return '\n'.join(new_data)

df = pd.read_csv(StringIO(repair(data, 3)), sep='|')
print(df)
印刷品:

    col1   col2   col3
0  vala1  vala2  vala3
1  valb1  valb2  valb3

字符串中没有显示行终止符,行只是终止并转到下一行。如果不进行一些预处理,熊猫就无法知道“valb2”应该在一条线上。输出按预期运行。在预处理步骤中会发生什么来更正此问题?如果我是你,我会通过字符串操作编辑文本。这样想吧——你怎么知道“valb2”实际上是一个值?是因为每一行应该有三列,因此在有两个管道(
|
)之前不应该断开这一行吗?@Andrej Kesely刚刚发布了一个预处理函数-但请注意,它需要用户输入来确定它应该有多少列。字符串中没有显示行终止符,该行只是终止并转到下一行。如果不进行一些预处理,熊猫就无法知道“valb2”应该在一条线上。输出按预期运行。在预处理步骤中会发生什么来更正此问题?如果我是你,我会通过字符串操作编辑文本。这样想吧——你怎么知道“valb2”实际上是一个值?是不是因为每行应该有三列,因此在有两个管道(
|
)之前,这行不应该断开?好了,@Andrej Kesely刚刚发布了一个预处理功能-但是请注意,它需要用户输入来确定它应该有多少列。我认为这会起作用。我很幸运,因为引起这一切的专栏并不在结尾。这看起来像是一种很老套的方法,但我想我也无能为力。我想这会奏效的。我很幸运,因为引起这一切的专栏并不在结尾。这似乎是一种很不礼貌的做法,但我想我也无能为力。