【问题标题】:Efficient way to do matrix operations on Panda slice via .loc在 Pandas 切片签证 .loc 上进行矩阵运算的有效方法
【发布时间】:2019-12-10 15:30:18
【问题描述】:

我正在寻找一种通过 .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

我的目标是有效地执行一个操作,其中我从第一个切片(第 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 而不使用矩阵转换来做到这一点?

【问题讨论】:

    标签: python pandas numpy matrix slice


    【解决方案1】:

    注意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
    

    【讨论】:

    • 如果我想做多个操作(加、减、除等),我可以链接 .add()、.sub() 等并保持一个轴值吗?
    • @NSHAH 是的。这是comprehensive list of binary operator functions。所有的元素运算符都有axis 作为选项,包括您列出的所有运算符。
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多