2015-03-02 135 views
1

我想將一組列s_cols與其他兩列b,c相乘。在熊貓中高效地乘以列

到目前爲止,我在做

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

但這一次吸引所有的16GB的內存了我的系統,墜毀我的OSX - 該表有148000行。

我該怎麼做呢?我猜應用row-wise需要較少的活動內存,但它似乎比矢量化操作低效。

表:

       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 

UPDATE

這個問題好像是用df[s_cols]。單個列的乘法立即發生,但已經乘以df[['t070101', 't070102']]的時間足夠長,以至於我害怕系統再次崩潰並搶先關閉Python進程。

+0

如果您將操作分成兩步,它會成功嗎?所以't = df ['c'] * df ['b'] dfNew = df [s_cols] * t' – EdChum 2015-03-02 21:56:30

+0

說實話我不期望上面有什麼不同,你是哪個版本的numpy和pandas使用? – EdChum 2015-03-02 21:58:32

+0

@EdChum:'1.9.1'和'0.15.0'。是的,以上是沒有什麼不同。 – FooBar 2015-03-02 22:01:19

回答

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 

正如你可以用這個例子中看到您的代碼:該指數是預先計劃在列(使數據幀的大小是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,看到大熊貓文檔的enhancing performance with eval部分。不過,我認爲目前還沒有多重任務的支持,所以在這種情況下,它不會有幫助 - 但它是值得閱讀的。

0

該問題顯然是由pandas對數據幀分片df[s_cols]的次優處理造成的。

相反,如果我做

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

操作幾乎瞬間完成。