在Pandas中播放列表

时间:2014-02-08 18:22:43

标签: python numpy pandas broadcast

我有一个数据框(a),我想从列中减去列表(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

3 个答案:

答案 0 :(得分:2)

我建议使用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

答案 1 :(得分:1)

我认为这可能更容易阅读和理解:

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

答案 2 :(得分: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]