快速将多个列添加到Pandas数据框中

Ben*_*uhn 7 python performance numpy dataframe pandas

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

df[foo] = bar通过从dict构造第二个数据帧并将它们连接起来,我已经设法通过天真的重复获得了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)
Run Code Online (Sandbox Code Playgroud)

时间显示出实质性的改善:

%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
Run Code Online (Sandbox Code Playgroud)

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

编辑:此外,concat我的真实代码中的通话比我的玩具示例要长得多; 特别是get_result功能需要更长的时间,尽管生产df具有较少的行,我无法弄清楚为什么.任何关于如何加快这一点的建议将不胜感激.

Joh*_*hnE 5

我对你的数据框到底应该是什么样子有点困惑,但是使用通用技术很容易加快速度。基本上,对于 pandas/numpy 的速度,您希望避免for和任何concat/merge/join/append(如果可能的话)。

\n\n

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

\n\n

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

\n\n
%timeit pd.DataFrame(  np.ones([10,100]).cumsum(axis=0) \n                     + np.ones([10,100]).cumsum(axis=1) )\n10000 loops, best of 3: 158 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想你正在尝试做这样的事情?(如果没有,如果您不熟悉 numpy,请查看它,它具有各种数组操作,这将使您在这里尝试执行的任何操作都变得非常容易)。

\n\n
In [63]: df.ix[:5,:10]\nOut[63]: \n   0   1   2   3   4   5   6   7   8   9   10\n0   2   3   4   5   6   7   8   9  10  11  12\n1   3   4   5   6   7   8   9  10  11  12  13\n2   4   5   6   7   8   9  10  11  12  13  14\n3   5   6   7   8   9  10  11  12  13  14  15\n4   6   7   8   9  10  11  12  13  14  15  16\n5   7   8   9  10  11  12  13  14  15  16  17\n
Run Code Online (Sandbox Code Playgroud)\n