我正在寻找一种通过.loc在熊猫切片上进行矩阵运算的有效方法
比方说,我的数据框的以下.loc切片具有datetimeindex
(df.loc['07-30-19':,'2':'4'])=
2 3 4
Date
2019-07-30 5.0 4.0 3.0
2019-07-31 2.0 3.0 4.0
2019-08-01 1.0 2.0 3.0
在df中还有另一列称为A(共享相同的dateindex),
(df.loc['07-30-19':,'A'])
Date
2019-07-30 2.0
2019-07-31 3.0
2019-08-01 4.0
我的目标是有效地执行一项操作,即相对于它们具有的共享日期时间索引,我从第一片中的每个对应列(第2-4个列)中减去值A。
基本上我想结束
2 3 4
Date
2019-07-30 3.0 2.0 1.0
2019-07-31 -1.0 0.0 1.0
2019-08-01 -3.0 -2.0 -1.0
我尝试如下使用切片操作,但是搞砸了
(df.loc['07-30-19':,'2':'4'])-df.loc['07-30-19':,'A']
Out[115]:
2019-07-30 00:00:00 2019-07-31 00:00:00 ... 3 4
Date ...
2019-07-30 NaN NaN ... NaN NaN
2019-07-31 NaN NaN ... NaN NaN
2019-08-01 NaN NaN ... NaN NaN
我使用numpy的工作实质上是将A的值转换为匹配的nxn矩阵作为切片,然后进行矩阵数学运算
(df.loc['07-30-19':,'2':'4'])-(df.loc['07-30-19':,'A'].values.reshape(3,1)*np.ones((1,3)))
Out[118]:
2 3 4
Date
2019-07-30 3.0 2.0 1.0
2019-07-31 -1.0 0.0 1.0
2019-08-01 -3.0 -2.0 -1.0
但是我想知道是否有更简单的方法可以通过.loc而不使用矩阵变换?
答案 0 :(得分:2)
请注意axis=0
。这不是默认设置。
代码:
import pandas as pd
data = [
['2019-07-30', 5.0, 4.0, 3.0, 2.0],
['2019-07-31', 2.0, 3.0, 4.0, 3.0],
['2019-08-01', 1.0, 2.0, 3.0, 4.0],
]
columns = ['Date', '2', '3', '4', 'A']
df = pd.DataFrame(data=data, columns=columns)
df.set_index('Date', inplace=True)
df_new = df.loc['2019-07-30':, '2':'4'].sub(df.loc['2019-07-30':, 'A'], axis=0)
print(df_new)
结果:
2 3 4
Date
2019-07-30 3.0 2.0 1.0
2019-07-31 -1.0 0.0 1.0
2019-08-01 -3.0 -2.0 -1.0