如何为熊猫中的重复记录填充Null

时间:2019-05-24 13:41:39

标签: python pandas dataframe

我有一个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

2 个答案:

答案 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列的类型为字符串或日期,则此方法相同。