Python 如果前一列中的值不同,是否制作一个增加的计数器?
我制作了一个计数器列,仅当I-1处的值与I不同时,计数器列才会增加 以下是数据示例: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-
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