python - 通过 .loc 在 Panda 切片上进行矩阵运算的有效方法

标签 python pandas numpy matrix slice

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

假设我有以下带有日期时间索引的数据帧的 .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

我的目标是有效地执行一项操作,即根据它们拥有的共享日期时间索引,从第一个切片(第 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

关于python - 通过 .loc 在 Panda 切片上进行矩阵运算的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57319100/

相关文章:

python - 从 Eclipse 运行时关闭 matplotlib 中预先存在的图形

python - 将参数作为字符串传递给 zip(),避免使用 exec()

python - 字符串 "integers"到占 "non-numeric"字符串的整数的列表 Python

python - 在Python中从灰度热图创建多色阈值图像

python - 如何加速 Pandas 操作(按嵌套列表项分组)

python - Pandas 与 pickle 0.14.1 和 0.15.2 的向后兼容性问题

python - 如何在不使用其他功能的情况下进行 GroupBy?

python - 使用 numpy 进行快速蒙特卡洛模拟?

python - 使用 numpy 在 python 中绘制分段函数

python - Pytesseract,试图从屏幕上检测文本