python - 如何创建一个基于多个条件增加的ID?
问题描述
我需要根据某些特定条件创建一个增加一的 ID:
- 上一行的 RespondentID 与该行的 RespondentID 不同
- 当最后一行有目的 == 1
- 当最后一行有目的 == 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:新的(第一个)响应者 ID。
2:最后一行在目的中有 1。
3、5、7 和 11:新的 RespondentID(最后一行在目的中有 1)。
4 和 10:最后一行的目的为 7,行程编号为 1。
6 和 9:新的 RespondentID
8:新的 RespondentID(最后一行的目的是 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
但我也需要它在其他两个条件下增加一。
解决方案
创建一个真/假系列,检查这些条件是否为真。然后cumsum
那个系列。使用.shift
允许我们检查前几行的条件。当我们得到'd时,它会.fillna(False)
修复第一行。shift
NaN
因为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()
推荐阅读
- java - Google Play 支持 0 台设备 - 应用更新
- python - 使用 Python 为 3 体问题创建跨越式算法的问题
- c# - ASP Net Core 2.1 会话
- android - Android - 如何从活动切换显示背光
- apache-spark - 如何在 spark 2.3.1 api 中使用累加器
- r - 使用自定义 PROJ 位置在 lwgeom 包 R 中安装错误
- python - python-pptx中的'add_run'是什么意思?
- php - 如何优化大型 CSV 文件数据提取的循环
- swift - 为什么空检查不好/如果它为空,为什么我希望可选项成功?
- php - 将数据从 curl 传递到 codeigniter 上的视图