我有一个df,其中包含JIRA票证状态的快照,df包含这些票证的多个快照,因此存在一些重复。我想用当前最新的票证状态填充先前快照中的空值(只要id在一个点处为Null)。
例如:
snapshot id status date
week1 111 Null 2019-10-10
week2 111 Null 2019-10-17
week3 111 Analysis 2019-10-23
我想将第1周和第2周的状态更改为分析。
另一种情况是:
snapshot id status date
week1 111 Null 2019-10-10
week2 111 Triage 2019-10-17
week3 111 Analysis 2019-10-23
week2是Triage,但最近的week3是Analysis,df仍应更改为:
snapshot id status date
week1 111 Analysis 2019-10-10
week2 111 Analysis 2019-10-17
week3 111 Analysis 2019-10-23
答案 0 :(得分:0)
您可以将NaN
分配给所有没有max
日期的行,然后使用backfill (bfill)
到fillna
m = df['date'].eq(df.groupby('id')['date'].transform('max'))
df['status'] = np.where(m, df['status'], np.NaN)
df['status'] = df['status'].bfill()
snapshot id status date
0 week1 111 Analysis 2019-10-10
1 week2 111 Analysis 2019-10-17
2 week3 111 Analysis 2019-10-23
注意
如果您的date
列还没有日期时间类型,请先将其转换:
df['date'] = pd.to_datetime(df['date'])
答案 1 :(得分:0)
我将按id
分组,以仅选择具有Null状态的ID,然后将这些组中的所有状态值替换为最后的状态。代码可能是:
for _, sub in df.groupby('id'):
if len(sub.loc[sub['status'].str.match('Null')]) > 0: # at least one Null in group
dat = sub['date'].max() # max date in group
status = sub.loc[sub['date']==dat, 'status'].iat[0] # last status
if status != 'Null': # caution...
df.loc[sub.index, 'status'] = status
如果date
列的类型为字符串或日期,则此方法相同。