Python Pandas read_csv到不带分隔符的数据框

时间:2019-10-01 21:39:21

标签: python pandas

我是熊猫图书馆的新手。
我已经共享了可以在数据框之外运行的代码。

有没有一种方法可以在没有任何分隔符的情况下逐行读取gzip文件(使用整行,该行可以包含逗号和其他字符)作为单行并在数据框中使用它?似乎必须提供一个定界符,当我提供“ \ n”时,它可以读取,但是error_bad_lines会抱怨“跳过第xxx行:预期有22个字段,但有23个字段”,因为每行都是不同的。

我希望它将每一行都视为数据帧中的一行。如何做到这一点?任何提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果只希望每一行是一行一行,那么不要使用read_csv。只需逐行读取文件并从中构建数据框架。

您可以通过创建带有单列标题的空数据框来手动执行此操作。然后遍历文件中的每一行,将其添加到数据框。

#explicitly iterate over each line in the file appending it to the df.
import pandas as pd
with open("query4.txt") as myfile:
    df = pd.DataFrame([], columns=['line'])
    for line in myfile:
        df = df.append({'line': line}, ignore_index=True)
    print(df)

这将适用于大型文件,因为我们一次只处理一行,并构建数据帧,因此我们不会使用超出需要的内存。这可能不是最有效的方法,在这里对数据框进行了大量重新分配,但肯定可以。

但是,由于熊猫数据框可以采用可迭代的方式作为数据输入,因此我们可以更干净地做到这一点。

#create a list to feed the data to the dataframe.
import pandas as pd
with open("query4.txt") as myfile:
    mydata = [line for line in myfile]
    df = pd.DataFrame(mydata, columns=['line'])
    print(df)

在这里,我们将文件的所有行读入列表,然后将该列表传递给pandas以从中创建数据。但是,这样做的缺点是,如果我们的文件很大,则在内存中实际上将有2个副本。列表中的一项,数据帧中的一项。

鉴于我们知道熊猫会接受数据的迭代,因此我们可以使用生成器表达式为我们提供一个生成器,该生成器会将文件的每一行馈送到数据帧。现在,通过一次从文件中读取每一行来构建数据框架。

#create a generator to feed the data to the dataframe.
import pandas as pd
with open("query4.txt") as myfile:
    mydata = (line for line in myfile)
    df = pd.DataFrame(mydata, columns=['line'])
    print(df)

在所有三种情况下,都不需要使用read_csv,因为要加载的数据不是csv。每个解决方案都提供相同的数据帧输出

源数据

this is some data
this is other data
data is fun
data is weird
this is the 5th line

数据帧

                   line
0   this is some data\n
1  this is other data\n
2         data is fun\n
3       data is weird\n
4  this is the 5th line