亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 94 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號