Python 使用Pandas提高文本文件处理效率
我有一个文本文件,里面有超过一百万个观察值,我正试图将它处理成一个数据帧。问题是它看起来像这样:Python 使用Pandas提高文本文件处理效率,python,pandas,data-cleaning,Python,Pandas,Data Cleaning,我有一个文本文件,里面有超过一百万个观察值,我正试图将它处理成一个数据帧。问题是它看起来像这样: product/productId: blah blah product/title: blue shirt product/price: unknown review/userId: blah blah review/text: blah blah product/productId: blah blah product/title: pair of jeans product/price: u
product/productId: blah blah
product/title: blue shirt
product/price: unknown
review/userId: blah blah
review/text: blah blah
product/productId: blah blah
product/title: pair of jeans
product/price: unknown
review/userId: blah blah
review/text: blah blah
每一个文本块都是一个独特的观察结果,我必须将它们分组并在一个整洁的数据框架中将它们排成行。总而言之,这需要处理500多万行
我对Python相当陌生,所以我不太确定清理这个问题的最佳方法是什么。我首先将文件读入一个文件:
initialData=pd.read\u csv(args[“data\u file”],sep=“\n”,header=None,dtype=str)
initialData.columns=[“数据”]
打印(initialData.head(5),“\n\n”,initialData.shape)
输出:
data
0 product/productId: blah blah
1 product/title: blah blah
2 product/price: unknown
3 review/userId: blah blah
4 review/profileName: blah blah
(5819330, 1)
然后,我尝试使用以下函数将每行中的数据组织到具有命名列的相应行中:
def组织数据(df):
df[“col”]=0
#根据观察结果对线进行分组
对于范围(0,len(df),10)内的行数:
索引=[行计数,行计数+1,行计数+2,
行计数+3,行计数+4,行计数+5,
行计数+6,行计数+7,行计数+8,行计数+9]
#遍历分组行
对于索引中的索引:
行=df.iloc[索引]
#拆分输入,为“列”分配一个
#将用于将每个值分配给其
#各栏
拆分行=行[“数据”]。拆分(“,1)
新建\u标签=拆分\u行[0]
最后一次分割=新的分割(“/”)
future\u col\u name=上次拆分[1]
行[“列”]=未来列名称
有组织的数据透视(columns=“col”,values=“data”)
返回
正如您可以想象的那样,如果它在文件中的每一行都进行迭代,那么它的速度就慢得令人难以置信。它给了我一个启动CopyWarning的设置,所以当它完成时,它甚至不做我想做的事情。如何处理这些问题?我的建议是切换到或
如果要继续使用pandas,请尝试以下技巧读取CSV文件,方法如下:
chunksize
参数:允许您一次读取一段文件。对于
例如,在您的案例中,您可以使用等于一百万的chunksize
将得到5个块,您可以对每个块进行操作
个别地。通过这种方式,您将使用一个迭代器,chunksize=1000000
所做的是给您一个读取1000000行数据帧的读卡器对象,而不是读取整个对象。换句话说,要惰性地迭代一个(可能非常大)文件,而不是将整个文件读入内存,请指定一个chunksize以读取\u csv调用(指定一次迭代要读取的行数)
dtype
parameter:使用此参数,您只需传递如下字典即可指定每列的数据类型:{'a':np.float32,'b':np.int32,'c':'int32'}
熊猫可以使用64位数据类型,而32位可能就足够了。使用此技巧可以节省50%的空间
您可以对数据进行一些预处理,而不是使用read_csv。我建议collections模块中的defaultdict将列表中的所有列分组。然后,我们可以将defaultdict传递到DataFrame构造函数中,以获得最终输出:
from collections import defaultdict
import pandas as pd
with open('reviews.txt', 'r') as f:
lines = f.readlines()
data = defaultdict(list)
for line in lines:
col,value = line.split(':')
data[col.strip()].append(value.strip())
df = pd.DataFrame(data)
print(df)
product/productId product/title product/price review/userId review/text
0 blah blah blue shirt unknown blah blah blah blah
1 blah blah pair of jeans unknown blah blah blah blah