Python 创建Pandas/NumPy函数以查找序列中的值何时更改?

Python 创建Pandas/NumPy函数以查找序列中的值何时更改?,python,pandas,numpy,Python,Pandas,Numpy,在数据帧中,我有一个名为“States”的列,它描述了各种事件发生的位置,因此许多行被重复,然后变为另一种状态: States - California - California - California - California - California - New Mexico - New Mexico - New Mexico - Hawaii - California 我正在尝试运行一个pandas函数,该函数将为每个状态分配一个变量,但在每次状态更改时该变量都是唯一的。因此,即使状态

在数据帧中,我有一个名为“States”的列,它描述了各种事件发生的位置,因此许多行被重复,然后变为另一种状态:

States
- California
- California
- California
- California
- California
- New Mexico
- New Mexico
- New Mexico
- Hawaii
- California
我正在尝试运行一个pandas函数,该函数将为每个状态分配一个变量,但在每次状态更改时该变量都是唯一的。因此,即使状态重复,它们也不会得到与上次在列表中时相同的值。从上面的例子中,我可以得到:

new_column
- 1
- 1
- 1
- 1
- 1
- 2
- 2
- 2
- 3
- 4 #even though this is 'California', it's a new,unique value
我现在已经试过了

def new_id(stateVal):
    x = Kentucky #first state in the list that I'm comparing to
    y = 1 #the unique value
    if stateVal == x:
        return y
    elif stateVal != x:
        x == w
        y++
        return y
    else:
        return 0

当我将它应用到数据集中的STATE列时,它没有正常工作。Pandas或NumPy中是否有预定义的函数来帮助实现这一点?

您可以这样做,将每个元素与下一个元素进行比较:

count=1
for i,row in enumerate(df['state'] == df['state'].shift(-1)):
    if row:
        df.at[i,'new_column'] = count
    else:
        df.at[i,'new_column'] = count
        count+=1

df['new_column'] = df['new_column'].astype(int) #convert to int if necessary
也许有一种更干净的方法可以避免这种循环,但我认为这就是你想要的

编辑一条直线,给出相同的输出:

df['new_column'] = df['state'].ne(df['state'].shift()).cumsum()

y++
不是有效的python。但我正在绞尽脑汁寻找这方面的规范:/y++是否等同于y+=1?@DerekEden非常肯定,但它只是表明代码在发布之前实际上没有经过测试,或者是来自内存。在任何情况下,有一个简单的方法可以做到这一点,我只是有一个大脑屁试图找到它一行应该是显着更快,因为它的矢量化。对此,最初的方法也可以从答案中删除。太棒了!!非常感谢,我能够得到这些数字,而不必转换为int