如果前一列中的值不同,则制作一个增加的计数器?
Making a counter that increases if value in previous column is different?
我正在制作一个计数器列,它仅在 (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
错误:
KeyError: 0
df1 = df[['user_id','sc_id']].ne(df[['user_id','sc_id']].shift()).cumsum().add_prefix('g_')
df['subcat_counter'] = df.join(df1).groupby(['g_user_id','g_sc_id'], sort=False).ngroup() + 1
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()
我正在制作一个计数器列,它仅在 (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
错误:
KeyError: 0
df1 = df[['user_id','sc_id']].ne(df[['user_id','sc_id']].shift()).cumsum().add_prefix('g_')
df['subcat_counter'] = df.join(df1).groupby(['g_user_id','g_sc_id'], sort=False).ngroup() + 1
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()