首页 > 解决方案 > 如何创建一个基于多个条件增加的ID?

问题描述

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

  1. 上一行的 RespondentID 与该行的 RespondentID 不同
  2. 当最后一行有目的 == 1
  3. 当最后一行有目的 == 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

但我也需要它在其他两个条件下增加一。

标签: pythonpandasdataframeprimary-keydata-cleaning

解决方案


创建一个真/假系列,检查这些条件是否为真然后cumsum那个系列。使用.shift允许我们检查前几行的条件。当我们得到'd时,它会.fillna(False)修复第一行。shiftNaN

因为df['RespondentID'].ne(df['RespondentID'].shift())第一行总是返回 True,所以计数保证从 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()

推荐阅读