大熊猫在奇数行取平均值

时间:2018-09-29 09:36:23

标签: python pandas dataframe

我想用当前行和下一行(其中列为数字)的平均值填充数据帧中每一行之间的数据

开始数据:

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

中级df:

   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 个答案:

答案 0 :(得分:2)

使用DataFrame.reindexDataFrame.interpolate的此方法怎么样

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

说明

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

这给出了一个这样的DataFrame:

     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

然后使用DataFrame.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
相关问题