我正在尝试遍历 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
最佳答案
您可以使用 shift
和 cumsum
实现相同的目的,这将比循环快得多:
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
关于python - 在 Pandas apply() 函数中计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38267210/