Pandas重复记录如何填写空值

2024-09-29 02:24:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含JIRA票证状态快照的df,df包含这些票证的多个快照,因此有一些重复。我想用当前最新的票证状态填充以前快照中的空值(只要id在某一点上为空)

例如:

snapshot  id  status    date
week1     111  Null     2019-10-10
week2     111  Null     2019-10-17
week3     111  Analysis 2019-10-23

我想将week1和week2的状态更改为analysis

另一种情况是:

snapshot  id  status    date
week1     111  Null     2019-10-10
week2     111  Triage   2019-10-17
week3     111  Analysis 2019-10-23

第2周是分类,但最新的第3周是分析,df仍应更改为:

snapshot  id   status   date 
week1     111  Analysis 2019-10-10
week2     111  Analysis 2019-10-17
week3     111  Analysis 2019-10-23

Tags: iddfdate状态statusjirasnapshotanalysis
2条回答

您可以将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列还没有datetime类型,请首先转换它:

df['date'] = pd.to_datetime(df['date'])

我将按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列的类型为string或date,则该方法的效果相同

相关问题 更多 >