在DataFrame中,我有一列称为“状态”,它描述了各种事件发生的位置,因此许多行被重复,然后变为另一种状态:
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中是否有预定义的函数可以帮助您解决此问题?
答案 0 :(得分:2)
您可以这样做,将每个元素与下一个元素进行比较:
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()