【问题标题】:replace nans with max value plus 1 incrementally用最大值加 1 增量替换 nans
【发布时间】:2019-10-08 07:46:58
【问题描述】:

我有一个如下所示的数据框:

我想从那一年的最大值继续填充 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)

这会将 nans 替换为以下文本:

函数位于 0x000002201F43CB70

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

df1['id'] = df1['id'].apply(lambda x: x['id'].fillna(x['id'].max() +1))

但我得到一个错误:

TypeError: 'float' object is not subscriptable

【问题讨论】:

  • df.interpolate 可能会有所帮助......只是还没有弄清楚如何按年份分组使用它
  • @Will 您可以使用this answer 与 df.interpolate 和 group by 结合。但我不确定如何通过插值实现最大值+1。

标签: python


【解决方案1】:

您可以使用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

编辑

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

    if pd.notnull(row['id']): ...

【讨论】:

  • 每行加 1。即使是现有的值。我不会投反对票,因为你很亲密!
  • 有一个 if 语句可以避免这种情况:)
  • 我在他的数据上运行了你的代码,这就是返回的结果:P。
  • 感谢您指出这一点。出于某种原因,我几乎无法使用 np.nan 处理条件。将其替换为空值
  • 所以只要 df 按年份排序就可以了
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
相关资源
最近更新 更多