用最大值加1替换nan

Dre*_*ead 5 python

我有一个看起来像这样的数据框:

在此处输入图片说明

我想通过从该年的最大值继续填充NaN(即,基于每年的最大值逐渐增加)。

这是我要实现的目标:

在此处输入图片说明

我知道如何分别对每年应用这样的方法的唯一方法是,在for循环中为每年创建单独的数据帧,然后将它们重新附加在一起。

#data
d = {'year': {0: 2016,
  1: 2016,
  2: 2016,
  3: 2016,
  4: 2017,
  5: 2017,
  6: 2017,
  7: 2017,
  8: 2018,
  9: 2018,
  10: 2018},
 'id': {0: 1015.0,
  1: 1016.0,
  2: nan,
  3: nan,
  4: 1035.0,
  5: 1036.0,
  6: nan,
  7: nan,
  8: 1005.0,
  9: nan,
  10: nan}}

# list of years
years = [2016,2017,2018]

# create dataframe    
df = pd.DataFrame(d)

# create list that I will append data frames too
l = []

for x in years:
    # create a dataframe for each year
    df1 = df[df['year']==x].copy()
    # fill nans with max value plus 1
    df1['id'] = df1['id'].fillna(lambda x: x['id'].max() + 1)
    # add dataframe to list
    l.append(df1)
# concat list of dataframes
final = pd.concat(l)
Run Code Online (Sandbox Code Playgroud)

这将nans替换为以下文本:

功能在0x000002201F43CB70

我也尝试在for循环中使用它:

df1['id'] = df1['id'].apply(lambda x: x['id'].fillna(x['id'].max() +1))
Run Code Online (Sandbox Code Playgroud)

但是我得到一个错误:

TypeError: 'float' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

Seb*_*n D 3

您可以使用df.iterrows()遍历行并df.loc[]设置缺失的“id”值:

for index, row in df.iterrows():
    if row['id'] > 0 : continue
    df.loc[index,"id"] = df[df['year']==row['year']]['id'].max() +1
Run Code Online (Sandbox Code Playgroud)

编辑

检查 row['id'] 是否不为 null 的更好方法是:

    if pd.notnull(row['id']): ...
Run Code Online (Sandbox Code Playgroud)