Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果前一列中的值不同,是否制作一个增加的计数器?_Python_Pandas_Counter - Fatal编程技术网

Python 如果前一列中的值不同,是否制作一个增加的计数器?

Python 如果前一列中的值不同,是否制作一个增加的计数器?,python,pandas,counter,Python,Pandas,Counter,我制作了一个计数器列,仅当I-1处的值与I不同时,计数器列才会增加 以下是数据示例: user_id sc_id 1 100 1 100 1 101 1 100 2 100 2 105 3 105 3 105 下面是我的代码: df['subcat_counter'] = 1 for i in range(1,len(df)): if df.sc_id[i-

我制作了一个计数器列,仅当I-1处的值与I不同时,计数器列才会增加

以下是数据示例:

user_id sc_id
1         100
1         100
1         101
1         100
2         100
2         105
3         105
3         105
下面是我的代码:

df['subcat_counter'] = 1

for i in range(1,len(df)):
    if df.sc_id[i-1]==df.sc_id[i] and df['user_id'][i-1]==df['user_id'][i]:
        df.at[i,'subcat_counter']=df.subcat_counter[i-1]
    else:
        df.at[i,'subcat_counter']=df.subcat_counter[i-1]+1
以下是所需的输出:

user_id sc_id   subcat_counter
1         100    1
1         100    1
1         101    2
1 .       100    3
2         100    4
2         105    5
3         105    6
3         105    6
错误:

关键错误:0

使用:

另一个解决方案:

s = df['user_id'].astype(str) + '_' + df['sc_id'].astype(str) 
df['subcat_counter'] = s.ne(s.shift()).cumsum()
print (df)

   user_id  sc_id  subcat_counter
0        1    100               1
1        1    100               1
2        1    101               2
3        1    100               3
4        2    100               4
5        2    105               5
6        3    105               6
7        3    105               6
使用:

另一个解决方案:

s = df['user_id'].astype(str) + '_' + df['sc_id'].astype(str) 
df['subcat_counter'] = s.ne(s.shift()).cumsum()
print (df)

   user_id  sc_id  subcat_counter
0        1    100               1
1        1    100               1
2        1    101               2
3        1    100               3
4        2    100               4
5        2    105               5
6        3    105               6
7        3    105               6

如果您关心的只是前一行,则可以使用.shift获取其值,然后进行相应的比较。在这里,我们检查user_id和sc_id是否与前一行匹配,并对其求反,以找到我们希望更改值的点。然后我们将其转换为int,得到True为1,False为0。这不是严格必要的,但有助于解释发生了什么,然后进行累积求和

prev_row = df.shift(1)

df['subcat_counter'] = (
    ~(df['user_id'].eq(prev_row['user_id']) & df['sc_id'].eq(prev_row['sc_id']))
).astype(int).cumsum()

如果您关心的只是前一行,则可以使用.shift获取其值,然后进行相应的比较。在这里,我们检查user_id和sc_id是否与前一行匹配,并对其求反,以找到我们希望更改值的点。然后我们将其转换为int,得到True为1,False为0。这不是严格必要的,但有助于解释发生了什么,然后进行累积求和

prev_row = df.shift(1)

df['subcat_counter'] = (
    ~(df['user_id'].eq(prev_row['user_id']) & df['sc_id'].eq(prev_row['sc_id']))
).astype(int).cumsum()

这不起作用,因为当用户返回到相同的sc_id时,它会给出相同的计数器……因此,如果用户if on sc_id 100计数器应该是1,那么用户转到sc_id 101的计数器应该是2,那么如果用户返回到sc_id 100的计数器应该是13@NitinKansal-你能更改数据吗?因为对于您的示例数据,它工作得很好。如果要将计数器重置为1,如果用户id更改,那么可以更改什么?@NitinKansal-我认为是的,将.ngroup+1更改为.cumcount+1这不起作用,因为当用户返回到相同的sc_id时,它会提供相同的计数器……因此,如果用户if on sc_id 100计数器应为1,然后用户转到sc_id 101计数器应为2,然后若用户返回到sc_id 100计数器应为23@NitinKansal-你能更改数据吗?因为您的示例数据运行良好。如果要将计数器重置为1,如果用户id更改,可以更改哪些内容?@NitinKansal-我认为可以,将.ngroup+1更改为.cumcount+1