为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2022-09-06 16:20:39
所以我有一个数据帧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  interval0     NaN         51     NaN         52  2015.0         53  2020.0         54     NaN        105     NaN        106     NaN        107  2090.0        108  2100.0        10我需要根据NaN值的间隔和该索引后面的第一个非nan向后填充NaN值,因此预期的输出是    value  interval0  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 change4  2060.0        10  # corrected 2070 - 105  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 = Nonefixed_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 = valprint (reversed(fixed_values))严格来说,这是有效的...但我想了解一个可以解析值并避免循环的pandas解决方案(这在现实中是一个相当大的列表)
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

首先,获取共享相同“间隔”值的组中行的位置。

然后,获取每个组的最后一个值。

你要找的是“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']


查看完整回答
反对 回复 2022-09-06
?
白板的微信

TA贡献1883条经验 获得超3个赞

创建一个分组系列,该序列通过用 反转来将最后一个非空值与其前面的所有行分组。然后,您可以并用于确定从每行中减去多少。NaN[::-1]bfillcumsum


s = 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  interval

0  2005.0         5

1  2010.0         5

2  2015.0         5

3  2020.0         5

4  2060.0        10

5  2070.0        10

6  2080.0        10

7  2090.0        10

8  2100.0        10

因为 是 NaN 行的子集,所以确保具有值的行保持不变subtfill_value=0


print(subt)

#6    10

#5    20

#4    30

#1     5

#0    10

#Name: interval, dtype: int64


查看完整回答
反对 回复 2022-09-06
  • 2 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信