我想用当前行和下一行(其中列为数字)的平均值填充数据帧中每一行之间的数据
开始数据:
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
有没有一种方法,而不必为每一列编写单独的函数并一一应用于每个列(在实际数据中,我有数十列)?
答案 0 :(得分:2)
使用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)
半步
这给出了一个这样的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