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