Python 创建一个新的列,该列根据id从行中获取值
如何在熊猫数据帧中执行以下操作?我有一个时间序列,我想创建一个新的列,它基于与前一个历元的值相同的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[
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)
注:
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)
注:
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()
或逻辑索引(indexdf[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,这非常有效!:)