如何创建一个根据多个条件增加的ID?

How to create an ID that increases based on multiple conditions?

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

  1. 上一行的 RespondentID 与这一行的 RespondentID 不同
  2. 当最后一行有 Purpose == 1 时
  3. 当最后一行有 Purpose == 7 AND 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] 

分解。

此解决方案适用于条件 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 个条件下增加一个。

创建一个 True/False 系列,检查这些条件中的 任何 是否为真。然后cumsum那个系列。使用 .shift 允许我们检查前几行的条件。当我们 shift 得到 NaN 时,.fillna(False) 修复了第一行。

因为df['RespondentID'].ne(df['RespondentID'].shift())第一行总是returns真,所以保证从1开始计数

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()