用于列表元素的Pandas rolling_apply

时间:2016-02-22 05:47:03

标签: python pandas

我已经积累了计数器,其元素是列表。与先前的行相比,累积每个列表元素。

import pandas as pd
d=pd.DataFrame({'counter': {0: [1,0,2], 1:[1,2,3], 2:[4, 4, 5]}})

我可以使用apply函数获取maxcounter。

def maxf(x): return max(x.counter)
d['maxcounter']=d.apply(lambda row: maxf(row), axis=1)  

现在我还想要字段“max_increment”,获取当前行和前一行之间的差异,然后计算最大值。我们可以使用rolling_apply吗?

预期输出如下。

     counter    maxcounter  increase_max
0   [1, 0, 2]   2   NaN 
1   [1, 2, 3]   3   2
2   [4, 4, 5]   5   3

注意:计数器是一个列表,每个元素都从分离的传感器递增。 这不是优化结构,而是我们现在得到的结果。

     counter    counter_incr    increase_max   max_incr_index
0   [1, 0, 2]   
1   [1, 2, 3]   [0, 2, 1]         2                1
2   [4, 4, 5]   [3, 2, 2]         3                0

1 个答案:

答案 0 :(得分:1)

  

获取当前行与前一行

之间的差异

由于你的类型不是数字(它是一个列表),似乎最简单的方法是执行一个pd.Series.shift,然后用一个操作从前一个元素中减去每个元素:

import numpy as np
>>> [(np.array(c) - np.array(p)) \
    for c, p in zip(d.counter, d.counter.shift(-1))]
[array([ 0, -2, -1]), array([-3, -2, -2]), array([ nan,  nan,  nan])]