python - 快速将多列添加到 Pandas 数据框

标签 python performance numpy pandas dataframe

我正在编写一些对性能敏感的代码,我必须在其中快速向 Pandas 数据框添加大量列。

通过从字典构建第二个数据帧并将它们连接起来,我已经设法比天真地重复 df[foo] = bar 获得了 3 倍的改进:

def mkdf1(n):
    df = pd.DataFrame(index=range(10,20), columns=list('qwertyuiop'))
    for i in xrange(n):
        df['col%d' % i] = range(i, 10+i)
    return df

def mkdf2(n):
    df = pd.DataFrame(index=range(10,20), columns=list('qwertyuiop'))
    newcols = {}
    for i in xrange(n):
        newcols['col%d' % i] = range(i, 10+i)
    return pd.concat([df, pd.DataFrame(newcols, index=df.index)], axis=1)

时间显示有显着改善:

%timeit -r 1 mkdf1(100)
100 loops, best of 1: 16.6 ms per loop

%timeit -r 1 mkdf2(100)
100 loops, best of 1: 5.5 ms per loop

我可以在这里进行任何其他优化吗?

编辑:此外,concat 调用在我的实际代码中花费的时间比我的玩具示例要长得多;特别是 get_result 函数需要更长的时间,尽管生产 df 的行数更少,我不知道为什么。任何有关如何加快速度的建议都将不胜感激。

最佳答案

我对您的数据框究竟应该是什么样子感到有点困惑,但使用一般技术很容易加快速度。基本上为了 pandas/numpy 的速度,你要避免 for 和任何 concat/merge/join/append,如果可能的话。

这里最好的选择是最有可能使用 numpy 创建一个数组,该数组将作为数据框的输入,然后根据需要命名列。就计算时间而言,这两个操作应该都是微不足道的。

这是 numpy 的部分,看起来你已经知道如何构造列名了。

%timeit pd.DataFrame(  np.ones([10,100]).cumsum(axis=0) 
                     + np.ones([10,100]).cumsum(axis=1) )
10000 loops, best of 3: 158 µs per loop

我认为您正在尝试制作这样的东西? (如果没有,如果您不熟悉它,只需查看 numpy,它有各种数组操作,应该可以很容易地完成您想在这里做的任何事情)。

In [63]: df.ix[:5,:10]
Out[63]: 
   0   1   2   3   4   5   6   7   8   9   10
0   2   3   4   5   6   7   8   9  10  11  12
1   3   4   5   6   7   8   9  10  11  12  13
2   4   5   6   7   8   9  10  11  12  13  14
3   5   6   7   8   9  10  11  12  13  14  15
4   6   7   8   9  10  11  12  13  14  15  16
5   7   8   9  10  11  12  13  14  15  16  17

关于python - 快速将多列添加到 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29188578/

相关文章:

python - Pandas - 多数据框多列条件检查和分配

python - 反转 Pandas DataFrame 中的行值

python - 将值列表拆分为字典列表

database - 管理大量数据的最佳数据库解决方案

python - 如何使用 h5py 更新二维数组?

python - 如何从一个字符串 block 创建一个二维 numpy 数组

python - 如何从列表中删除 unicode 中的\xa0

c# - 获取位图像素列的最佳且快速的方法是什么?

c++ - Rcpp/RcppArmadillo C++/R 平衡性能

python - 通过pygame.sndarray播放正弦波时出错