根据pandas中连续行的值替换列值

2024-03-28 19:21:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个定义为df_in的数据帧:

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,让具有相同连续值的所有行都被分配一个新值(根据我将要描述的特定规则)。我将举一个更清楚的例子:前三个rows['B']等于200。因此,他们所有人都将分配数字1;第四个和第五个row['B']等于400,因此他们将被分配为数字2。这个过程重复到最后。 最终结果(df_out)应该如下所示:

^{pr2}$

注意

  • 最后一个row['B']等于200,但分配给它的新值是6,而不是{}!因此不能有重复的值。在
  • 值必须始终从1开始,因此按递增顺序排列。在

你能给我一个聪明的方法来用熊猫来达到这样的效果吗?在

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


Tags: 数据inimportpandasdf定义as数字
1条回答
网友
1楼 · 发布于 2024-03-28 19:21:40

可以按^{}移位列进行比较,然后使用^{}

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

相关问题 更多 >