pandas 按间隔填充以更正缺失/无效的条目

所以我有一个数据帧


df = pandas.DataFrame([[numpy.nan,5],[numpy.nan,5],[2015,5],[2020,5],[numpy.nan,10],[numpy.nan,10],[numpy.nan,10],[2090,10],[2100,10]],columns=["value","interval"])


    value  interval

0     NaN         5

1     NaN         5

2  2015.0         5

3  2020.0         5

4     NaN        10

5     NaN        10

6     NaN        10

7  2090.0        10

8  2100.0        10

我需要根据NaN值的间隔和该索引后面的第一个非nan向后填充NaN值,因此预期的输出是


    value  interval

0  2005.0         5  # corrected 2010 - 5(interval)

1  2010.0         5  # corrected 2015 - 5(interval)

2  2015.0         5  # no change ( use this to correct 2 previous rows)

3  2020.0         5  # no change

4  2060.0        10  # corrected 2070 - 10

5  2070.0        10  # corrected 2080 - 10 

6  2080.0        10  # corrected 2090 - 10 

7  2090.0        10  # no change (use this to correct 3 previous rows)

8  2100.0        10  # no change

我不知道如何使用pandas / numpy矢量化操作来完成此任务...


我可以用一个非常简单的循环来做到这一点


last_good_value = None

fixed_values = []

for val,interval in reversed(df.values):

    if val == numpy.nan and last_good_value is not None:

       fixed_values.append(last_good_value - interval)

       last_good_value = fixed_values[-1]

    else:

       fixed_values.append(val) 

       if val != numpy.nan:

           last_good_value = val


print (reversed(fixed_values))

严格来说,这是有效的...但我想了解一个可以解析值并避免循环的pandas解决方案(这在现实中是一个相当大的列表)


拉风的咖菲猫
浏览 74回答 2
2回答

慕侠2389804

首先,获取共享相同“间隔”值的组中行的位置。然后,获取每个组的最后一个值。你要找的是“last_value - pos * interval”df = df.reset_index()grouped_df = df.groupby(['interval'])df['pos'] = grouped_df['index'].rank(method='first', ascending=False) - 1 df['last'] = grouped_df['value'].transform('last')df['value'] = df['last'] - df['interval'] * df['pos']del df['pos'], df['last'], df['index']

白板的微信

创建一个分组系列,该序列通过用 反转来将最后一个非空值与其前面的所有行分组。然后,您可以并用于确定从每行中减去多少。NaN[::-1]bfillcumsums = df['value'].notnull()[::-1].cumsum()subt = df.loc[df['value'].isnull(), 'interval'][::-1].groupby(s).cumsum()df['value'] = df.groupby(s)['value'].bfill().subtract(subt, fill_value=0)    value  interval0  2005.0         51  2010.0         52  2015.0         53  2020.0         54  2060.0        105  2070.0        106  2080.0        107  2090.0        108  2100.0        10因为 是 NaN 行的子集,所以确保具有值的行保持不变subtfill_value=0print(subt)#6    10#5    20#4    30#1     5#0    10#Name: interval, dtype: int64
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python