Python 在大数据处理下的优化(三)DataFrame的生成效率提高4倍!!

今天看标题就知道我们又来谈的是优化,针对pandas的数据结构DataFrame做的优化。
当然这种优化更多的是提供给大家一种思路,而不是所有的DataFrame都可以这么转化。
废话不多说,我们直接来看今天的主要优化内容。

一、DataFrame数据结构

做过数据处理这块的应该都知道并且非常熟悉的pandas下最常用的二维表结构,DataFrame。
DataFrame自带的各种处理数据的函数给我们复杂的需求带来了很多的便捷,并且在数据量较少的情况下,处理速度都非常快,因此在很多地方都会用到相关的一些函数,例如apply,groupby等等。

但是!
在这里插入图片描述在这里插入图片描述
使用这些便捷的函数的时候,首先要把数据转换成DataFrame吧。
有的童鞋说,很简单呀,直接调用DataFrame就可以转换了呀。
是的没错,直接调用就可以了。
但是在数据量特别大的情况下,直接调用对于追求高效率的你来说肯定是不够的。
在调用之前我们要对数据进行一下转换,能使得生成DataFrame的效率提高4倍!!
在这里插入图片描述

二、合理使用split+numpy

split 函数 对字符串进行切割
numpy 矩阵的处理库
在使用split函数的情况下
例如我们有如下的数据
list = [‘张三#5’,‘李四#10’]
像‘张三#5’这种储存结构在数据储存也比较常用,用某些特殊字符串将数据串起来,节省空间,但是就是处理数据的时候稍微麻烦一点。

现在假设我们有大量的这样的数据,但是希望将数据转换成DF格式,两列指标,名称,数值。便于对数据进行分析处理。
最常用的方法如下:

import pandas as pd
a_list = ['张三#5','李四#10']
df = pd.DataFrame([a.split("#") for a in a_list])

的确是这样,但是这样的方法在数据量很大的情况下处理数据太慢了。
给大家提供一种其他的处理方式,能使得速度快4倍以上。

def make_df(a_list):
    res_str = "#".join(a_list)
    res_list = res_str.split("#")
    df = pd.DataFrame(np.array(res_list).reshape(len(res_list)/2,2))
    return df

借助join函数代替for循环,然后使用np.array函数的reshape将数据转换成DF的格式。
注:这里需要注意数据的完整性。

进行速度比较

b_list = a_list*10000000
from time import time
start = time()
df = pd.DataFrame([a.split("#") for a in b_list])
print('pandas_df Time: {:5.2f}s'.format(time() - start))
start = time()
df_1 = make_df(b_list)
print('pandas_numpy_df Time: {:5.2f}s'.format(time() - start))

将a_list的长度增加1kw倍。
结果如下
在这里插入图片描述
可以看到这种使用join+numpy的方法使得结果快了4倍。
这里只是提供了最简单的数据,实际上会有不同的数据需求,但是如果可以借助这种思路去处理数据真的可以使得速度快上很多倍。

看到这里可能会有部分童鞋说,这里应该只是优化了split的循环,实际上确实是split的循环比较耗时,难道np.array不能加速到DataFrame的转换吗?

在这里插入图片描述
其实我也很好奇,于是我又做了一下对比。

a_list = [['张三',5],['李四',10]]
a_1_list = ['张三',5,'李四',10]
df = pd.DataFrame(a_list)

def make_df(res_list):
    # res_str = "#".join(res_list)
    # res_list = res_str.split("#")
    df = pd.DataFrame(np.array(res_list).reshape(len(res_list)/2,2))
    return df
b_list = a_list*10000000
c_list = a_1_list*10000000
from time import time
start = time()
df = pd.DataFrame(b_list)
print('pandas_df Time: {:5.2f}s'.format(time() - start))
start = time()
df_1 = make_df(c_list)
print('pandas_numpy_df Time: {:5.2f}s'.format(time() - start))

这里全都省略掉split,并且原始数据也写成了最简单的列表格式。
看一下结果如下

在这里插入图片描述
可以看到整体速度确实比前面split的时候快上很多,而且去掉split的时候,第二种方法没有比第一种方法快上4倍那么多,但是还是比直接使用DF转化要快很多,特别是在数据量大的时候,这种转化方法可以节省更多的时间。

三、总结

DataFrame自带的很多函数给我们处理数据带来了很多便利,但是在使用DF给我们带来的高效率的时候,也要注意转换成DF或许也有更加高效率的方法。

这篇文章主要提供给大家一种转换方法思路~

我是一只前进的蚂蚁,希望能一起前行。

如果对您有一点帮助,一个赞就够了,感谢!

注:如果本篇博客有任何错误和建议,欢迎各位指出,不胜感激!!!

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读