我是熊猫图书馆的新手。
我已经共享了可以在数据框之外运行的代码。
有没有一种方法可以在没有任何分隔符的情况下逐行读取gzip文件(使用整行,该行可以包含逗号和其他字符)作为单行并在数据框中使用它?似乎必须提供一个定界符,当我提供“ \ n”时,它可以读取,但是error_bad_lines会抱怨“跳过第xxx行:预期有22个字段,但有23个字段”,因为每行都是不同的。
我希望它将每一行都视为数据帧中的一行。如何做到这一点?任何提示将不胜感激。
答案 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