我有一个这样的数据框
$('#edit_question1').val(response.qry1.data[i].parameter);
$('#edit_question2').val(response.qry1.data[i].parameter);
$('#edit_question3').val(response.qry1.data[i].parameter);
$('#edit_question4').val(response.qry1.data[i].parameter);
$('#edit_question5').val(response.qry1.data[i].parameter);
$('#edit_question6').val(response.qry1.data[i].parameter);
$('#edit_question7').val(response.qry1.data[i].parameter);
$('#edit_question8').val(response.qry1.data[i].parameter);
$('#edit_question9').val(response.qry1.data[i].parameter);
$('#edit_question10').val(response.qry1.data[i].parameter);
$('#edit_question11').val(response.qry1.data[i].parameter);
$('#edit_question12').val(response.qry1.data[i].parameter);
我想将其拆分为间隔,并为每个间隔计算每个间隔第一行的值差。 结果应该像这样,以6为间隔(内部的行只是为了更好地说明):
time value
0 1 214
1 4 234
2 5 253
3 7 272
4 9 201
5 11 221
6 13 211
7 15 201
8 17 199
使用以下代码,我得到了想要的结果,但是我认为代码不是很优雅。有没有更好的解决方案(例如,如何在loc语句中集成子集项)?
time value diff_to_first
0 1 214 0
1 4 234 20
2 5 253 39
--------------------------------
3 7 272 0
4 9 201 -71
5 11 221 -51
--------------------------------
6 13 211 0
7 15 201 -10
8 17 199 -12
答案 0 :(得分:1)
您可以创建一个新的列“ group”。然后使用groupby并应用您定义的函数以按组将列与diff连接起来。它将更加优雅。但我认为,我创建“组”列的方式也可以更优雅=)
def diff(df):
df['diff_to_first'] = df.value - df.value.values[0]
return df
df['group'] = np.concatenate([[i] * 3 for i in range(0, len(df)/3)])
df.groupby('group').apply(diff)
输出:
time value group diff_to_first
0 1 214 0 0
1 4 234 0 20
2 5 253 0 39
3 7 272 1 0
4 9 201 1 -71
5 11 221 1 -51
6 13 211 2 0
7 15 201 2 -10
8 17 199 2 -12
答案 1 :(得分:1)
您可以按interval的值对数据帧进行分组,并通过移动1个索引将分组的数据相差
interval = 3
df['diff_to_first'] = df.value.groupby(np.repeat(np.arange(len(df)/interval),interval)[:len(df)]).apply(lambda x:x-x.shift()).fillna(0)
出局:
time value diff_to_first
0 1 214 0.0
1 4 234 20.0
2 5 253 19.0
3 7 272 0.0
4 9 201 -71.0
5 11 221 20.0
6 13 211 0.0
7 15 201 -10.0
8 17 199 -2.0