当前位置: 首页 > 知识库问答 >
问题:

熊猫:如何解决“错误标记化数据”?

习和通
2023-03-14

关于这个话题,人们已经提出了很多问题。(和许多其他人)。在众多的答案中,到目前为止,没有一个对我真正有帮助。如果我错过了有用的,请告诉我。

我只想将带有熊猫的CSV文件读入数据框。听起来很简单。

我的文件Test.csv

1,2,3,4,5
1,2,3,4,5,6
,,3,4,5
1,2,3,4,5,6,7
,2,,4

我的代码:

import pandas as pd
df = pd.read_csv('Test.csv',header=None)

我的错误:

pandas.errors.ParserError: Error tokenizing data. C error: Expected 5 fields in line 2, saw 6

我对这个问题的猜测是,Pandas看第一行,并期望在下面的行中有相同数量的代币。如果不是这样,它将以错误停止。

在众多答案中,使用选项的建议包括,例如:error\u bad\u lines=Falseheader=Noneskiprows=3以及更多无帮助的建议。

但是,我不想忽略任何行或跳过。我不知道数据文件有多少列和行。

因此,它基本上归结为如何在数据文件中找到最大列数。这是路吗?我希望有一种简单的方法来读取CSV文件,该文件在第一行没有最大列数。谢谢你的提示。我正在使用Python 3.6。3,熊猫0.24。Win7上的1。

共有3个答案

滕令雪
2023-03-14

我对这个解决方案有不同的看法。让pandas负责创建表并删除None值,让我们负责编写适当的标记器。

def tokenize(str):
    idx = [x for x, v in enumerate(str) if v == '\"']
    if len(idx) % 2 != 0:
        idx = idx[:-1]
    memory = {}
    for i in range(0, len(idx), 2):
        val = str[idx[i]:idx[i+1]+1]
        key = "_"*(len(val)-1)+"{0}".format(i)
        memory[key] = val
        str = str.replace(memory[key], key, 1)        
    return [memory.get(token, token) for token in str.split(",")]  
print (tokenize("1,2,3,4,5"))
print (tokenize(",,3,\"Hello, World!\",5,6"))
print (tokenize(",,3,\"Hello,,,, World!\",5,6"))
print (tokenize(",,3,\"Hello, World!\",5,6,,3,\"Hello, World!\",5,6"))
print (tokenize(",,3,\"Hello, World!\",5,6,,3,\"Hello,,5,6"))

输出

['1','2','3','4','5'] ['', '', '3','Hello, World!','5','6'] ['', '', '3','Hello,, World!','5','6'] ['', '', '3','你好,世界!','5','6', '', '3','你好,世界!','5','6'] ['', '', '3','你好,世界!','5','6', '', '3','"你好', '', '5','6']

with open("test1.csv", "r") as fp:
    lines = fp.readlines()

lines = list(map(lambda x: tokenize(x.strip()), lines))
df = pd.DataFrame(lines).replace(np.nan, '')

现在,我们可以根据需要对标记器函数进行柚木处理

宦子琪
2023-03-14

使用容忍的python csv模块读取csv,并在将其移交给熊猫之前修复加载的文件,这将在其他格式错误的csv数据上失败,而不管熊猫使用的csv引擎如何。

import pandas as pd
import csv

not_csv = """1,2,3,4,5
1,2,3,4,5,6
,,3,4,5
1,2,3,4,5,6,7
,2,,4
"""

with open('not_a.csv', 'w') as csvfile:
    csvfile.write(not_csv)

d = []
with open('not_a.csv') as csvfile:
    areader = csv.reader(csvfile)
    max_elems = 0
    for row in areader:
        if max_elems < len(row): max_elems = len(row)
    csvfile.seek(0)
    for i, row in enumerate(areader):
        # fix my csv by padding the rows
        d.append(row + ["" for x in range(max_elems-len(row))])

df = pd.DataFrame(d)
print df

# the default engine
# provides "pandas.errors.ParserError: Error tokenizing data. C error: Expected 5 fields in line 2, saw 6 "
#df = pd.read_csv('Test.csv',header=None, engine='c')

# the python csv engine
# provides "pandas.errors.ParserError: Expected 6 fields in line 4, saw 7 "
#df = pd.read_csv('Test.csv',header=None, engine='python')

如果担心python内部的额外代码会创建太多python代码,则在python外部预处理文件。

Richs-MBP:tmp randrews$ cat test.csv
1,2,3
1,
2
1,2,
,,,
Richs-MBP:tmp randrews$ awk 'BEGIN {FS=","}; {print $1","$2","$3","$4","$5}' < test.csv
1,2,3,,
1,,,,
2,,,,
1,2,,,
,,,,
巢烨
2023-03-14

感谢@ALollz提供的“非常新鲜”链接(幸运的巧合)和@Rich Andrews指出我的示例实际上不是“严格正确”的CSV数据。

因此,目前我的工作方式是从@ALollz'紧凑型解决方案改编而来的(https://stackoverflow.com/a/55129746/7295599)

### reading an "incorrect" CSV to dataframe having a variable number of columns/tokens 
import pandas as pd

df = pd.read_csv('Test.csv', header=None, sep='\n')
df = df[0].str.split(',', expand=True)
# ... do some modifications with df
### end of code

df包含空字符串',用于开头和中间缺少的条目,以及结尾缺少的标记。

   0  1  2  3     4     5     6
0  1  2  3  4     5  None  None
1  1  2  3  4     5     6  None
2        3  4     5  None  None
3  1  2  3  4     5     6     7
4     2     4  None  None  None

如果您再次通过以下方式将此内容写入文件:

df。至csv(“Test.tab”,sep=“\t”,header=False,index=False)

1   2   3   4   5       
1   2   3   4   5   6   
        3   4   5       
1   2   3   4   5   6   7
    2       4           

None将转换为空字符串',一切正常。

下一个层次是说明引号中包含分隔符的数据字符串,但这是另一个主题。

1,2,3,4,5
,,3,"Hello, World!",5,6
1,2,3,4,5,6,7
 类似资料:
  • 我用python 2.7.7安装了Anaconda。 但是,每当我运行“import pandas”时,就会出现错误: 我尝试运行建议的命令,但它指出 以前是否有人遇到过这种情况并找到了解决方案?

  • 我有一个有 7 列的 csv 文件 问题是我试图设置日期时间索引,但它不起作用可能是因为日期和时间是两个单独的列。 代码如下: 错误如下: C:\用户\sydgo\Anaconda3\_locE:/教程/pandas_libsTraceback(最近调用最后一次):文件“C:\用户\sydgo\Anaconda3\lib\站点包\熊猫\核心\索引\_loc”,第2442行,get_loc返回自我。

  • 我检查了这个答案,因为我有一个类似的问题。 Python在标记数据时出错 然而,由于某种原因,我的所有行都被跳过了。 我的代码很简单: 我得到的错误是:

  • 问题内容: 假设我有一个熊猫数据框: 我想计算数据框的列均值。 这很简单: 然后按列范围max(col)-min(col)。这又很容易: 现在,对于每个元素,我要减去其列的均值并除以其列的范围。我不确定该怎么做 任何帮助/指针将不胜感激。 问题答案:

  • > 显然停止了服务。给出以下结果: 确保关闭Microsoft管理控制台(), 确保关闭事件查看器,

  • 我有如下的XML文件。 我想解析crewMember标签,并从中获取id、姓氏、姓氏以及flightQualification中的iSaventured标签,所有这些都放在一个Pandas数据框中,如下所示: 我知道这将涉及一个for循环来检索firstName和lastName值,但在提取我需要的所有值时遇到困难。有没有快速的方法来做到这一点?