熊猫数据框的间隔计算

时间:2018-09-09 09:25:42

标签: python python-3.x pandas

我有一个这样的数据框

                    $('#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

2 个答案:

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