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

熊猫在*上阅读。用cedilla分隔的dat文件未在dataframe中拆分为列

梅安平
2023-03-14

这是我第一次研究熊猫,请原谅我的无知。我的要求是将一个文件从S3下载到Ec2上,并将dat文件放到数据帧上。这就是我的输入文件数据的外观

1Ç70Ç23929Ç4341Ç1111Ç0Ç0Ç1ÇAAÇ012ÇFillerÇ
1Ç75Ç45555Ç4324Ç2222Ç0Ç0Ç1ÇAAÇ011ÇFillerÇ
1Ç76Ç23957Ç4334Ç3333Ç0Ç0Ç1ÇAAÇ011ÇFillerÇ
1Ç72Ç47776Ç4344Ç4444Ç0Ç0Ç1ÇABÇ014ÇFillerÇ
1Ç73Ç88880Ç4354Ç4444Ç0Ç0Ç1ÇCDÇ011ÇFillerÇ
1Ç74Ç99991Ç4364Ç5555Ç0Ç0Ç1ÇEEÇ014ÇFillerÇ

由于数据似乎没有任何编码,所以我决定使用带有分隔符的read_Csv作为cedilla并存储在dataframe中。

iFldDelim = 'Ç'
tf = pandas.read_csv(itextfile, iFldDelim, nrows = 5,header=None)

但由于某些原因,它无法识别相同的数据并将数据放在一列中。

                                        0
0 1Ç70Ç23929Ç4341Ç1111Ç0Ç0Ç1ÇAAÇ012ÇFi...
1 1Ç75Ç45555Ç4324Ç2222Ç0Ç0Ç1ÇAAÇ011ÇFi...
2 1Ç76Ç23957Ç4334Ç3333Ç0Ç0Ç1ÇAAÇ011ÇFi...
3 1Ç72Ç47776Ç4344Ç4444Ç0Ç0Ç1ÇABÇ014ÇFi...
4 1Ç73Ç88880Ç4354Ç4444Ç0Ç0Ç1ÇCDÇ011ÇFi...

该文件似乎像ASCII和未编码。我确实尝试过使用UTF-8和UTF-16编码,并将Unicode值作为不起作用的分隔符。我还试图将分隔符硬编码为“F”,而不是cedilla,并运行代码,认为文件本身可能有一些加密/编码。但事实并非如此,我的输出由'F'分隔。

分隔符为“F”。

                                   0       1
0 1Ç70Ç23929Ç4341Ç1111Ç0Ç0Ç1ÇAAÇ012Ç  illerÇ
1 1Ç75Ç45555Ç4324Ç2222Ç0Ç0Ç1ÇAAÇ011Ç  illerÇ
2 1Ç76Ç23957Ç4334Ç3333Ç0Ç0Ç1ÇAAÇ011Ç  illerÇ
3 1Ç72Ç47776Ç4344Ç4444Ç0Ç0Ç1ÇABÇ014Ç  illerÇ
4 1Ç73Ç88880Ç4354Ç4444Ç0Ç0Ç1ÇCDÇ011Ç  illerÇ

我正在加载的文件通常是一个巨大的文件,这个文件运行了很长时间。所以我不确定我是否使用编解码器编码文件到UTF-8,然后放入数据框是一个明智的选择。

我试图手动创建一个cedilla分隔的文件,当通过同一个命令时,它工作得很好。我不知道这里出了什么问题。有没有办法确定它是否被编码?

任何建议都非常感谢。

谢谢,VB

采用Edchum advise,我使用以下,

#file location
dataPath = "C:/Users/Documents/Pytest/"
itextfile = join(dataPath,'sample.dat')

fb = open(itextfile, 'r')
data = fb.read() 
print(data)
tf=pandas.read_csv(StringIO(data), sep='Ç', header=None)
#tf=pandas.read_csv(StringIO(data), sep='\Ç', header=None)
print(tf)

文件中的数据如下所示

1Ç71Ç23929Ç44Ç5685Ç0Ç0Ç1ÇaaÇ012ÇFillerÇ
1Ç72Ç23953Ç40Ç3319Ç0Ç0Ç1ÇbbÇ011ÇFillerÇ
1Ç73Ç23957Ç43Ç7323Ç0Ç0Ç1ÇccÇ011ÇFillerÇ
1Ç74Ç24006Ç41Ç6938Ç0Ç0Ç1ÇbbÇ014ÇFillerÇ
1Ç75Ç24140Ç45Ç0518Ç0Ç0Ç1ÇddÇ011ÇFillerÇ

Output

    0    1      2   3     4   5   6   7   8   9      10  11
0    1  71  23929  44  5685   0   0   1  aa  12  Filler NaN
1    1  72  23953  40  3319   0   0   1  bb  11  Filler NaN
2    1  73  23957  43  7323   0   0   1  cc  11  Filler NaN

因此,使用sep='195\'8225;'而不是sep='\ch'是有效的。不知道为什么在我运行脚本时会出现这种情况,因为肉眼(当我打开sample.dat文件时)它看起来是用cedilla符号分隔的。

有没有一种方法可以在不从外部读取文本文件的情况下将文本文件传递给熊猫。读取csv(StringIO)命令?我问这个问题是因为我想限制读取和放入数据帧的行数。比如说,如果我只想要前几行,我添加了一个Totrows,最后几行我使用了skiprows。用这种方法处理包含数百万行的大型文件,所需时间最少。若这是不可能的,我将使用for循环。只是想看看是否有一种不用for循环的方法

谢谢,VB

共有2个答案

景帅
2023-03-14

作为标准做法,您可能希望使用编解码器包打开文档。这将允许您指定编码(在大多数情况下是UTF-16),编解码器包似乎非常擅长破译行终止符和编码等内容。

使用熊猫读取制表符分隔的文件-适用于Windows,但不适用于Mac

import codecs

doc = codecs.open('document','rU','UTF-16') (open for reading with "universal" type set)

df = pandas.csv_read(doc, sep='Ç', nrows=Totrows, header=Skiprows)
公孙巴英
2023-03-14

尝试传递sep='\ch',因为这对我很有用:

In [35]:
import pandas as pd
import io
t="""1Ç70Ç23929Ç4341Ç1111Ç0Ç0Ç1ÇAAÇ012ÇFillerÇ
1Ç75Ç45555Ç4324Ç2222Ç0Ç0Ç1ÇAAÇ011ÇFillerÇ
1Ç76Ç23957Ç4334Ç3333Ç0Ç0Ç1ÇAAÇ011ÇFillerÇ
1Ç72Ç47776Ç4344Ç4444Ç0Ç0Ç1ÇABÇ014ÇFillerÇ
1Ç73Ç88880Ç4354Ç4444Ç0Ç0Ç1ÇCDÇ011ÇFillerÇ
1Ç74Ç99991Ç4364Ç5555Ç0Ç0Ç1ÇEEÇ014ÇFillerÇ"""
pd.read_csv(io.StringIO(t), sep='\Ç', header=None)

Out[35]:

   0   1      2     3     4   5   6   7   8   9       10  11
0   1  70  23929  4341  1111   0   0   1  AA  12  Filler NaN
1   1  75  45555  4324  2222   0   0   1  AA  11  Filler NaN
2   1  76  23957  4334  3333   0   0   1  AA  11  Filler NaN
3   1  72  47776  4344  4444   0   0   1  AB  14  Filler NaN
4   1  73  88880  4354  4444   0   0   1  CD  11  Filler NaN
5   1  74  99991  4364  5555   0   0   1  EE  14  Filler NaN
 类似资料:
  • 问题内容: 我尝试将文件读入熊猫。该文件具有以空格分隔的值,但是我尝试使用不同数量的空格: 但这不起作用 问题答案: 添加参数,它比正则表达式更快。

  • 我有一个PySpark数据帧,其中一列包含逗号分隔的值。该列包含的值的数量是固定的(例如4)。示例: 在这里,我想将col2拆分为4个单独的列,如下所示: 如何做到这一点?

  • 问题内容: 我有一个DataFrame,说一个波动率表面,索引为时间,列为行权。如何进行二维插值?我可以,但是我该如何处理?我知道我们可以,但是甚至不是线性插值。有没有办法插入我们自己的方法进行插值? 问题答案: 您可以用来获取线性插值。 对于更复杂的事情,您需要推出自己的函数来处理一个对象并根据需要填充值并返回另一个对象。

  • 我试图加载一个csv文件内基于熊猫的数据帧。我使用了以下导入。 没有找到文件是抛出错误,回溯如下: ()中的FileNotFoundError回溯(最近一次调用)---- c:\users\saish\appdata\local\programs\python\python35-32\lib\site packages\pandas\io\parsers。语法分析器中的py\u f(文件路径或缓冲

  • 我正在处理一个大的csv文件,下一列的最后一列有一个文本字符串,我想用一个特定的分隔符来分割。我想知道是否有一种简单的方法可以使用pandas或python来实现这一点? 我想按空格分割,然后按列中的冒号分割,但是每个单元格将导致不同数量的列。我有一个重新排列列的函数,所以列在工作表的末尾,但是我不确定从那里做什么。我可以在excel中使用内置的函数和一个快速宏来完成,但是我的数据集有太多的记录需

  • 我的文件内容如下: 我需要在分隔符“”处拆分我的文件。并将前面的内容保存在字符串中。我怎么能那么做?我尝试了以下方法,但不起作用