我需要创建一个根据某些特定条件增加了一个ID的ID:
如果满足以上条件中的一项,则仍然只能增加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。
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()