2014-02-08 64 views
1

名單我有一個數據幀(一),從中我要減去一個列表(B),逐列:廣播在大熊貓

import numpy as np 
import pandas as pd 

In:a=pd.DataFrame(np.arange(0,20).reshape(5,4)) 
    print(a) 

Out: 0 1 2 3 
    0 0 1 2 3 
    1 4 5 6 7 
    2 8 9 10 11 
    3 12 13 14 15 
    4 16 17 18 19 

In: b=[1,2,3,4,5] 

我希望這個操作的工作:

c=a-b 

但是我得到一個錯誤。

以下操作做我想要的,但它不雅。什麼是正確的方法來做到這一點?

In: c=(a.T-b).T 
    print(a) 

Out: 0 1 2 3 
    0 -1 0 1 2 
    1 2 3 4 5 
    2 5 6 7 8 
    3 8 9 10 11 
    4 11 12 13 14 

回答

1

我推薦使用sub

>>> a = pd.DataFrame(np.arange(0,20).reshape(5,4)) 
>>> b = [1,2,3,4,5] 
>>> a.sub(b, axis=0) 
    0 1 2 3 
0 -1 0 1 2 
1 2 3 4 5 
2 5 6 7 8 
3 8 9 10 11 
4 11 12 13 14 

[5 rows x 4 columns] 
>>> np.allclose(a.sub(b,axis=0), (a.T-b).T) 
True 
+0

我試圖記住什麼正確/更好的方法是,並不記得這一個,所以我張貼'應用'作爲答案。 – EdChum

+0

埃德,在這種情況下,'sub'就是我在找的東西,但我肯定會在後面的口袋裏保留'apply lambda'方法 - 隊列中的下一個問題不是直接減法。謝謝! – Chris

0

您可以使用apply和使用lambda減去列表值逐列:

In [11]: 

import pandas as pd 
a=pd.DataFrame(np.arange(0,20).reshape(5,4)) 
b=[1,2,3,4,5] 

a 

Out[11]: 

    0 1 2 3 
0 0 1 2 3 
1 4 5 6 7 
2 8 9 10 11 
3 12 13 14 15 
4 16 17 18 19 

[5 rows x 4 columns] 

In [12]: 

c=a.apply(lambda x: x-b) 
c 

Out[12]: 

    0 1 2 3 
0 -1 0 1 2 
1 2 3 4 5 
2 5 6 7 8 
3 8 9 10 11 
4 11 12 13 14 

[5 rows x 4 columns] 
0

我覺得這可能是更容易閱讀和理解:

In [12]: 

import numpy as np 
a=pd.DataFrame(np.arange(0,20).reshape(5,4)) 
b=[1,2,3,4,5] 

In [13]: 

print (a.T-array(b)).T 
    0 1 2 3 
0 -1 0 1 2 
1 2 3 4 5 
2 5 6 7 8 
3 8 9 10 11 
4 11 12 13 14 

或者也許這個:

a-(np.zeros(a.shape)+array(b)[...,np.newaxis]) 

矩陣操作是最慢的,在的buildin .sub() @DSM和陣列廣播方法將是同樣快:

In [31]:         

%timeit a.sub(b, axis=0)     
1000 loops, best of 3: 565 us per loop  
In [32]:         

%timeit a-(np.zeros(a.shape)+array(b)[...,np.newaxis]) 
1000 loops, best of 3: 572 us per loop  
In [33]:         

%timeit (a.T-array(b)).T     
1000 loops, best of 3: 896 us per loop 

在情況下,如果你想知道,在lambda版本是最慢的,因爲它往往在案件python

In [36]: 

%timeit a.apply(lambda x: x-b) 
100 loops, best of 3: 2.63 ms per loop