【问题标题】:How to create an ID that increases based on multiple conditions?如何创建一个基于多个条件增加的ID?
【发布时间】:2020-08-13 23:36:01
【问题描述】:

我需要根据一些特定条件创建一个加一的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] 

分解它。

  • 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

但我还需要它与其他 2 个条件一起增加 1。

【问题讨论】:

  • 请清楚是什么阻止了你。你知道如何测试一个重要的条件——你只需要为你的其他规则编写测试,并在你的 ID 计算行中加入 or
  • 我明白你的意思。没想到只加一个“或”就这么简单。

标签: python pandas dataframe primary-key data-cleaning


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多