Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过.loc在Panda slice上执行矩阵运算的有效方法_Python_Pandas_Numpy_Matrix_Slice - Fatal编程技术网

Python 通过.loc在Panda slice上执行矩阵运算的有效方法

Python 通过.loc在Panda slice上执行矩阵运算的有效方法,python,pandas,numpy,matrix,slice,Python,Pandas,Numpy,Matrix,Slice,我正在寻找一种通过.loc在Panda切片上执行矩阵运算的有效方法 假设我有以下带有datetimeindex的数据帧的.loc片段 (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(共享相同的日期索引

我正在寻找一种通过.loc在Panda切片上执行矩阵运算的有效方法

假设我有以下带有datetimeindex的数据帧的.loc片段

(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(共享相同的日期索引),这样

(df.loc['07-30-19':,'A'])
Date
2019-07-30    2.0
2019-07-31    3.0
2019-08-01    4.0
我的目标是高效地执行一个操作,从第一个片段(cols 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实现这一点而不使用矩阵变换?注意
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
结果:

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

如果我想做多个操作(加法、减法、除法等),我可以只链.add()、.sub()等并保持一个轴值吗?@NSHAH是的。这是你的电话号码。所有按元素的运算符都有轴,这包括您列出的所有运算符。