用Pandas播报名单

2024-05-19 18:18:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧(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]

我希望这次行动能奏效:

^{pr2}$

但是我得到一个错误。在

下面的操作做了我想要的,但是不优雅。正确的方法是什么?在

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

Tags: 数据inimportnumpydataframepandas列表as
3条回答

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

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

或者这个:

^{pr2}$

矩阵操作最慢,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

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

可以使用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]

相关问题 更多 >