在熊猫中有效地乘以列

时间:2015-03-02 21:53:28

标签: python pandas

我想将一组列s_cols与另外两列bc相乘。

到目前为止,我正在做

s_cols = ['t070101', 't070102', 't070103', 't070104', 't070105', 't070199', 't070201', 't070299']
dfNew = df[s_cols]*df[`c`]*df[`b`]

但该操作从我的系统中吸取了所有16GB的内存并使我的OSX崩溃 - 该表有148000行。

我该怎么做?我想逐行应用需要较少的活动内存,但它看起来效率低于向量化操作。

表格:

                             b  TELFS  t070101  t070102  t070103  t070104  \
TUCASEID                                                                    
20030100013280  8155462.672158      2        0        0        0        0   
20030100013344  1735322.527819      1        0        0        0        0   
20030100013352  3830527.482672      2       60        0        0        0   
20030100013848  6622022.995205      4        0        0        0        0   
20030100014165  3068387.344956      1        0        0        0        0   

                t070105  t070199  t070201  t070299   \
TUCASEID                                                              
20030100013280        0        0        0        0  
20030100013344        0        0        0        0  
20030100013352        0        0        0        0  
20030100013848        0        0        0        0  
20030100014165        0        0        0           

                         c  
TUCASEID                               
20030100013280          31  
20030100013344          31  
20030100013352          31  
20030100013848          31  
20030100014165          31  

更新

问题似乎是使用df[s_cols]。单个列的乘法立即发生,但已经乘以df[['t070101', 't070102']]需要足够长的时间,以至于我害怕我的系统再次崩溃并抢先关闭Python进程。

2 个答案:

答案 0 :(得分:1)

我的猜测是你真的想做类似以下的事情:

In [11]: cols = ['a', 'b']

In [12]: df1
Out[12]:
   a  b  c   d
0  1  4  1   4
1  2  5  2  10
2  3  6  3  18

In [13]: df1[cols].multiply(df1['c'] * df1['d'], axis=0)
Out[13]:
     a    b
0    4   16
1   40  100
2  162  324

正如您可以通过此示例看到的代码:索引被添加到列之前(因此DataFrame的大小在长度上为N ^ 2,可能会导致内存错误/减速):

In [21]: df1[cols] * df1['c'] * df1['d']
Out[21]:
    0   1   2   a   b
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN

除此之外:您应该在此处放置括号以确保首先计算RHS。


这类问题的另一个选择是使用numexpr,请参阅pandas docs的enhancing performance with eval部分。但是我不认为(目前)支持多项任务,所以在这种情况下它无济于事 - 但是值得一读。

答案 1 :(得分:0)

问题显然是pandas'对数据帧切片df[s_cols]进行次优处理。

如果我做了

for col in s_cols:
    df[col] = df[col].multiply(df.monthDays * df.TUFNWGTP)

操作几乎立即完成。