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开始,因此按递增顺序排列
这是一个非常好的答案!谢谢如果我想从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