在Pandas中计算apply()函数

时间:2016-07-08 12:53:17

标签: python pandas

我试图迭代DataFrame,当值发生变化时,递增一个计数器,然后设置一个等于该值的新列。我能够使用全局计数器来实现这一点,如下所示:

def change_ind(row):
    global prev_row
    global k

    if row['rep'] != prev_row:
        k = k+1
        prev_row = row['rep']
    return k

但是当我尝试将参数传递给apply函数时,如下所示,它不再有效。看起来它每次在新行上运行时都会重置k,prev_row的值。有没有办法将参数传递给函数并获得我正在寻找的结果?还是一个更好的方法来完成这个?

def change_ind(row, k, prev_row):    
    if row != prev_row:
        k = k+1
        prev_row = row
    return k

1 个答案:

答案 0 :(得分:3)

您可以使用shiftcumsum实现同样的目标,这比循环要快得多:

In [107]:
df = pd.DataFrame({'rep':[0,1,1,1,2,3,2,3,4,5,1]})
df

Out[107]:
    rep
0     0
1     1
2     1
3     1
4     2
5     3
6     2
7     3
8     4
9     5
10    1

In [108]:    
df['rep_f'] = (df['rep']!=df['rep'].shift()).cumsum()-1
df

Out[108]:
    rep  rep_f
0     0      0
1     1      1
2     1      1
3     1      1
4     2      2
5     3      3
6     2      4
7     3      5
8     4      6
9     5      7
10    1      8