如何创建基于多种条件增加的ID?

问题描述 投票:2回答:1

我需要创建一个根据某些特定条件增加了一个ID的ID:

  1. 上面一行的RespondentID与该行的RespondentID不同
  2. 当最后一行具有目的== 1
  3. [当最后一行的目的是== 7并且TripNumber == 1

如果满足以上条件中的一项,则仍然只能增加1。

data = {'RespondentID': [101, 101, 101, 101, 102, 102, 102, 103, 103, 103, 106, 106, 106, 107, 108, 108, 109, 109, 109, 109, 109, 110], 
        'TripNumber':   [1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 2, 1, 2, 3, 4, 5, 1], 
        'Purpose':      [4, 1, 6, 1, 7, 4, 1, 4, 6, 8, 6, 5, 1, 7, 4, 4, 7, 5, 6, 5, 1, 4]} 

df = pd.DataFrame(data=data)

并且我需要创建

df['JourneyID'] = [1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 8, 9, 10, 10, 10, 10, 11] 

将其分解。

  • 1:新的(第一)受访者ID。

  • 2:最后一行的目的是1。

  • 3、5、7和11:新的RespondentID(最后一行的目的是1)。

  • 4和10:最后一行的目的是7,而TripNumber是1。

  • 6和9:新的受访者ID

  • 8:新的RespondentID(并且TripNumber时最后一行具有7目的)是1)

此解决方案在条件2下效果很好:

temp = ((df['purpose']==1).cumsum()+1).shift(1) 
#Makes it go up by one each time the previous row had purpose == 1
temp[0]=1
df['JourneyID'] = temp

但是我还需要在其他2个条件下将其增加1。

python pandas dataframe data-cleaning id
1个回答
1
投票
创建一个True / False Series,以检查这些条件中的

any是否为True。然后cumsum该系列。使用.shift可以检查上一行的条件。当我们.fillna(False)得到shift时,NaN修复第一行。

s = ( df['RespondentID'].ne(df['RespondentID'].shift()) # Condition 1 | df.Purpose.eq(1).shift().fillna(False) # Condition 2 | (df.Purpose.eq(7) & df.TripNumber.eq(1)).shift().fillna(False) # Condition 3 ) df['JourneyID'] = s.cumsum()
© www.soinside.com 2019 - 2024. All rights reserved.