【问题标题】:Vectorized solution for multiple column operation in a dataframe数据框中多列操作的矢量化解决方案
【发布时间】:2019-06-18 21:27:11
【问题描述】:

我可能会有一个大数据框,其中第一行如下:

   BUCHDAT     y  y1   y2    y3     y4    y5     y6     y7
7 2017-02-26 577 30.0 622.0 1785.0 2633.0 422.0 10497.0 364.0 

现在我想用公式替换“y”到“y7”列:

df['y'] = df['y'] - df['y1']

对此有任何矢量化解决方案吗?所以我想在每一列中应用这个公式,下一列的公式应该是:

df['y1'] = df['y1']- df['y2']

你知道怎么做吗?

【问题讨论】:

    标签: python pandas dataframe optimization vectorization


    【解决方案1】:

    这是一个使用底层 numpy 数组以获得良好性能的方法:

    df.iloc[:,1:-1] = df.values[:,1:-1] - df.values[:,2:]
    
    print(df)
    
        BUCHDAT      y     y1      y2     y3      y4       y5       y6     y7
    7  2017-02-26  547.0 -592.0 -1163.0 -848.0  2211.0 -10075.0  10133.0  364.0
    

    【讨论】:

    • 这是对数组的很好使用,您介意添加一些解释吗? +1
    • 是的,它确实是基本的切片@erfan,这就是我没有添加细节的原因。我将以下行减去当前列,直到最后一列
    • 这个解决方案更快:0.0 秒,这就是我选择它作为解决方案的原因
    • 我通常会添加一些解释。我确实认为不必通过非常基础的知识,除非显然 OP 水平非常低。我认为我不应该添加切片符号的工作方式。你不这么认为吗@erfan?
    【解决方案2】:

    DataFrame.subDataFrame.shift 一起使用:

    df1 = df.iloc[:, 1:].astype(float)
    df.iloc[:, 1:] = df1.sub(df1.shift(-1, axis=1))
    print (df)
          BUCHDAT      y     y1      y2     y3      y4       y5       y6  y7
    7  2017-02-26  547.0 -592.0 -1163.0 -848.0  2211.0 -10075.0  10133.0 NaN
    

    【讨论】:

    • 有没有先设置索引后重置的选项?我需要将索引保留为数字
    • 此操作耗时:0.015599966049194336 秒
    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多