Python 根据表中连续行的值替换列值

Python 根据表中连续行的值替换列值,python,pandas,dataframe,replace,sequence,Python,Pandas,Dataframe,Replace,Sequence,我在中有一个数据帧df_,定义如下: import pandas as pd dic_in = {'A':['aa','bb','cc','dd','ee','ff','gg','uu','xx','yy','zz'], 'B':['200','200','200','400','400','500','700','700','900','900','200'], 'C':['da','cs','fr','fs','se','at','yu','j5','31','d

我在中有一个数据帧
df_,定义如下:

import pandas as pd
dic_in = {'A':['aa','bb','cc','dd','ee','ff','gg','uu','xx','yy','zz'],
       'B':['200','200','200','400','400','500','700','700','900','900','200'],
       'C':['da','cs','fr','fs','se','at','yu','j5','31','ds','sz']}
df_in = pd.DataFrame(dic_in) 
我想调查列
B
,这样所有具有相同连续值的行都会被分配一个新值(根据我将要描述的特定规则)。我将举一个更清楚的例子:前三行['B']
等于
200
。因此,所有人都将分配数字1;第四行和第五行['B']等于
400
,因此它们将被分配为数字2。这个过程一直重复到结束。 最终结果(
df_out
)应如下所示:

# BEFORE #                # AFTER #
In[121]:df_in             In[125]df_out
Out[121]:                 Out[125]: 
     A    B   C                A  B   C
0   aa  200  da           0   aa  1  da
1   bb  200  cs           1   bb  1  cs
2   cc  200  fr           2   cc  1  fr
3   dd  400  fs           3   dd  2  fs
4   ee  400  se           4   ee  2  se
5   ff  500  at           5   ff  3  at
6   gg  700  yu           6   gg  4  yu
7   uu  700  j5           7   uu  4  j5
8   xx  900  31           8   xx  5  31
9   yy  900  ds           9   yy  5  ds
10  zz  200  sz           10  zz  6  sz
注意

  • 最后的
    行['B']
    等于
    200
    ,但分配给它的新值是
    6
    ,而不是
    1
    !因此,必须没有重复的值
  • 值必须始终从1开始,因此按递增顺序排列
你能给我建议一个聪明的方法,用熊猫来达到这样的效果吗

PS:手动映射值没有帮助,因为这是一个测试用例,最终我将有数千行要映射。它应该是自动的。

您可以通过移位列进行比较,然后使用:


这是一个非常好的答案!谢谢如果我想从0开始计数,你能告诉我应该怎么做吗?我想你可以用
df_in.B.ne(df_in.B.shift()).cumsum().sub(1)
减去
1
,我想用两列而不是一列来进行相同的运算,我还能用.ne吗?如果没有,你还需要什么函数?我想你可以使用.ne,eq和类似的函数。但是需要相同的列名和索引。
print (df_in.B.ne(df_in.B.shift()))
0      True
1     False
2     False
3      True
4     False
5      True
6      True
7     False
8      True
9     False
10     True
Name: B, dtype: bool

df_in.B = df_in.B.ne(df_in.B.shift()).cumsum()
#same as !=, but 'ne' is faster
#df_in.B = (df_in.B != df_in.B.shift()).cumsum()
print (df_in)
     A  B   C
0   aa  1  da
1   bb  1  cs
2   cc  1  fr
3   dd  2  fs
4   ee  2  se
5   ff  3  at
6   gg  4  yu
7   uu  4  j5
8   xx  5  31
9   yy  5  ds
10  zz  6  sz