代码之家  ›  专栏  ›  技术社区  ›  proximacentauri

熊猫在奇数行取平均数

  •  2
  • proximacentauri  · 技术社区  · 6 年前

    起始数据:

       time value value_1  value-2
    0   0    0      4        3
    1   2    1      6        6
    

       time value value_1  value-2
    0   0    0      4        3
    1   1    0      4        3     #duplicate of row 0
    2   2    1      6        6
    3   3    1      6        6     #duplicate of row 2
    

    我想创建dfï1:

       time value value_1  value-2
    0   0    0      4        3
    1   1    0.5    5        4.5     #average of row 0 and 2
    2   2    1      6        6
    3   3    2      8        8       #average of row 2 and 4
    

    为此,我附加了一个起始数据帧的副本,以创建如上所示的中间数据帧:

    df = df_0.append(df_0)
    df.sort_values(['time'], ascending=[True], inplace=True)
    df = df.reset_index()
    df['value_shift'] = df['value'].shift(-1)
    df['value_shift_1'] = df['value_1'].shift(-1)
    df['value_shift_2'] = df['value_2'].shift(-1)
    

    然后我想对每一列应用一个函数:

    def average_vals(numeric_val):
        #average every odd row
        if int(row.name) % 2 != 0:
            #take average of value and value_shift for each value
            #but this way I need to create 3 separate functions
    

    1 回复  |  直到 6 年前
        1
  •  2
  •   Chris Adams    6 年前

    用这种方法怎么样 DataFrame.reindex DataFrame.interpolate

    df.reindex(np.arange(len(df.index) * 2) / 2).interpolate().reset_index(drop=True)
    

    解释

    重新索引,半步 reindex(np.arange(len(df.index) * 2) / 2)

         time  value  value_1  value-2
    0.0   0.0    0.0      4.0      3.0
    0.5   NaN    NaN      NaN      NaN
    1.0   2.0    1.0      6.0      6.0
    1.5   NaN    NaN      NaN      NaN
    

    然后使用 数据帧.interpolate 填写 NaN

    最后,使用 .reset_index(drop=True) 来修正你的索引。

    应该给予

       time  value  value_1  value-2
    0   0.0    0.0      4.0      3.0
    1   1.0    0.5      5.0      4.5
    2   2.0    1.0      6.0      6.0
    3   2.0    1.0      6.0      6.0