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