Python 创建一个新的列,该列根据id从行中获取值

Python 创建一个新的列,该列根据id从行中获取值,python,pandas,Python,Pandas,如何在熊猫数据帧中执行以下操作?我有一个时间序列,我想创建一个新的列,它基于与前一个历元的值相同的id值。见图。我想做以下工作: 创建名为previous\u epoch\u stage的新列 对于每个id: 用epoch-1行中的stage值填充previous\u epoch\u stage列 但如果epoch==1,则用同一行的阶段值填充上一个阶段值 也许有一个更简单的解决方案,但另一个解决方案可能是: df['prev_epoch_stage']=[df['stage'].iloc[

如何在熊猫数据帧中执行以下操作?我有一个时间序列,我想创建一个新的列,它基于与前一个历元的值相同的id值。见图。我想做以下工作:

  • 创建名为
    previous\u epoch\u stage
    的新列
  • 对于每个
    id
    • 用epoch-1行中的
      stage
      值填充
      previous\u epoch\u stage
    • 但如果epoch==1,则用同一行的
      阶段
      值填充
      上一个阶段

    也许有一个更简单的解决方案,但另一个解决方案可能是:

    df['prev_epoch_stage']=[df['stage'].iloc[i-1] if e>1 else df['stage'].iloc[i]
                            for i,e in enumerate(epoch)]
    

    也许有一个更简单的解决方案,但另一个解决方案可能是:

    df['prev_epoch_stage']=[df['stage'].iloc[i-1] if e>1 else df['stage'].iloc[i]
                            for i,e in enumerate(epoch)]
    

    如果您只想访问
    epoch
    的滞后版本,则通常不需要创建额外的列。您只需执行
    df.groupby('id')
    ,然后在每个分组数据帧中引用
    ['epoch'].shift(1)

    但如果您真的坚持这样做,使用解决方案,并且

    # Do the default lagged assignment for all rows where 'epoch' != 1
    df['previous_epoch_stage'] = df.groupby('id')['epoch'].shift(1)
    # Now fill NA's in-place from the 'stage' column
    df['previous_epoch_stage'].fillna(df['stage'], inplace=True)
    # and if you want to reverse fillna and the NaNs coercing your ints to floats:
    df['previous_epoch_stage'] = df['previous_epoch_stage'].astype(int)
    
    注:

  • 如果我们假设/要求从1开始按递增的
    epoch
    顺序对行进行排序,则可以快捷方式“使用
    stage
    value from epoch-1行填充
    previous\u epoch\u stage
    列,然后我们可以只取
    df['stage'].head()
  • 还有一个有用的辅助函数
    df.where(cond,other,…)
    ](),它对if-else进行了矢量化,在这种情况下
    other
    需要是一个函数(“可调用”),但是
  • 是整洁的,因为它允许您自定义
    fill_value=NaN
    ,或指定任意
    期间(+ve或-ve)

  • 如果您只想访问
    epoch
    的滞后版本,则通常不需要创建额外的列。您只需执行
    df.groupby('id')
    ,然后在每个分组数据帧中引用
    ['epoch'].shift(1)

    但如果您真的坚持这样做,使用解决方案,并且

    # Do the default lagged assignment for all rows where 'epoch' != 1
    df['previous_epoch_stage'] = df.groupby('id')['epoch'].shift(1)
    # Now fill NA's in-place from the 'stage' column
    df['previous_epoch_stage'].fillna(df['stage'], inplace=True)
    # and if you want to reverse fillna and the NaNs coercing your ints to floats:
    df['previous_epoch_stage'] = df['previous_epoch_stage'].astype(int)
    
    注:

  • 如果我们假设/要求从1开始按递增的
    epoch
    顺序对行进行排序,则可以快捷方式“使用
    stage
    value from epoch-1行填充
    previous\u epoch\u stage
    列,然后我们可以只取
    df['stage'].head()
  • 还有一个有用的辅助函数
    df.where(cond,other,…)
    ](),它对if-else进行了矢量化,在这种情况下
    other
    需要是一个函数(“可调用”),但是
  • 是整洁的,因为它允许您自定义
    fill_value=NaN
    ,或指定任意
    期间(+ve或-ve)

  • 您可以使用
    shift
    函数获取上述行的值,如
    df['previous\u epoch\u stage']=df['stage']。shift(1)
    。之后,如果
    df[]époch']==1,只需编写
    stage
    值。但它还需要将此值与id匹配,否则它可以使用不同的id转到前一行通常当你想说“在每个组的基础上做一些分配”时,答案是
    df.groupby()
    或逻辑索引(索引
    df[df['epoch'!=1]
    )在这里,你想访问
    df['stage'].shift(
    )`.的滞后值。浏览一下关于选择、索引和选择数据、分组、处理缺失数据……这是你做很多强大事情的基本瑞士军刀工具包。我们还可以使用快捷方式“将
    上一个_epoch_stage
    列填入
    stage
    来自epoch-1行的值”如果我们假设/要求从1开始按递增的
    epoch
    对行进行排序,那么我们可以只取
    df['stage'].head()
    您可以使用
    shift
    函数获取上面行的值,如
    df['previous_epoch_stage']=df['stage'].shift(1)
    。之后,如果
    df[]époch']==1,只需编写
    stage
    值。但它还需要将其与id匹配,否则它可以使用不同的id转到前一行通常当你想说“在每个组的基础上做一些分配”时,答案是
    df.groupby()
    或逻辑索引(index
    df[df['epoch'!=1]
    )。在这里,您想访问
    df['stage']的滞后值。shift(
    )`。浏览一下关于选择、索引和选择数据、分组、处理丢失的数据……这是您基本的瑞士军刀工具包,可以用来做很多功能强大的事情。我们还可以选择快捷方式“在
    previous_epoch_stage
    列中填入
    stage
    来自epoch-1行的值“如果我们假设/要求从1开始按递增的
    epoch
    对行进行排序,那么我们可以只取
    df['stage'].head()
    但它怎么知道只有在id匹配时才这样做?然后将其更改为类似于
    df['stage'].iloc[i-1]如果e>1和df['id'].iloc[i-1]==df['id'].iloc[i]否则df['stage'].iloc[i]
    我想我理解这个逻辑,但我不知道如何声明什么是i和e…
    df['col'].iloc[i-1]
    只是
    df['col']
    伪装。更好,因为它允许您自定义
    fill_value=NaN
    @Apavlo:i,e是迭代的变量,但它怎么知道只有在id匹配时才这样做?然后将其更改为类似
    df['stage'].iloc[i-1]的东西,如果e>1和df['id'].iloc[i-1]==df['id'].iloc[i]否则df['stage'].iloc[i]
    我想我理解这一点的逻辑,但我不确定如何声明什么是I和e.
    df['col'].iloc[I-1]
    只是
    df['col'].shift()
    伪装。更好,因为它允许您自定义
    fill_value=NaN
    @Apavlo:i,e是通过Thank my G迭代的变量,这非常有效!:)Thank my G,这非常有效!:)