如何创建一个根据多个条件增加的ID?
How to create an ID that increases based on multiple conditions?
我需要根据特定条件创建一个加一的ID:
- 上一行的 RespondentID 与这一行的 RespondentID 不同
- 当最后一行有 Purpose == 1 时
- 当最后一行有 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]
分解。
1:新的(第一个)RespondentID。
2:最后一行的目的是 1。
3、5、7 和 11:新的 RespondentID(最后一行在 Purpose 中有 1)。
4 和 10:最后一行的 Purpose 和 TripNumber 是 1。
6 和 9:新的 RespondentID
8:新的 RespondentID(最后一行在 Purpose 中有 7,而 TripNumber
是 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 个条件下增加一个。
创建一个 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()
我需要根据特定条件创建一个加一的ID:
- 上一行的 RespondentID 与这一行的 RespondentID 不同
- 当最后一行有 Purpose == 1 时
- 当最后一行有 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]
分解。
1:新的(第一个)RespondentID。
2:最后一行的目的是 1。
3、5、7 和 11:新的 RespondentID(最后一行在 Purpose 中有 1)。
4 和 10:最后一行的 Purpose 和 TripNumber 是 1。
6 和 9:新的 RespondentID
8:新的 RespondentID(最后一行在 Purpose 中有 7,而 TripNumber 是 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 个条件下增加一个。
创建一个 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()