[英]Fill in zeros from data of past week (168 indexes prior) in a pandas dataframe
我有用電量數據。 在停電期間,數據為“0”。 我想用過去一周的同一時間的數據替換那些 0。 數據集中前后 168 個索引。
在下面的代碼中,我保存了所有零的索引。 運行一個循環,將位於數據集中 168 個索引前面的值放置在當前索引處。
Index_Zero = data[data["Total"]==0].index.to_list() #Output = list of indexes where all the zeros lie
print(Index_Zero[0]) #Output = 2
for i in Index_Zero:
data.loc[(Index_Zero[i]), 'Total']=data.loc[(Index_Zero[i+168]), 'Total']
另外,如果我打印
data.loc[(Index_Zero[0]), 'Total']=data.loc[(Index_Zero[2]), 'Total']
print(data.loc[(Index_Zero[0]), 'Total'])
Output: 0.0
數據集:
Date Time Total
0 23-Jan-2019 12:00:00 AM 18343.00
1 23-Jan-2019 01:00:00 AM 18188.00
2 23-Jan-2019 02:00:00 AM 0.00
3 23-Jan-2019 03:00:00 AM 23394.00
4 23-Jan-2019 04:00:00 AM 20037.00
我認為,更自然的解決方案是:
要執行此操作,請運行:
df.set_index(pd.to_datetime(df.Date + ' ' + df.Time), inplace=True)
for ind in df[df.Total.eq(0)].index:
df.loc[ind, 'Total'] = df.loc[ind - pd.Timedelta('1W'), 'Total']
df.reset_index(drop=True, inplace=True)
請注意,循環必須僅基於索引,而不是完整的行。 原因是停電可能發生在特定的工作日和時間,例如連續兩周(或更多)。
因此,基於完整行的循環( for ... in df[df.Total.eq(0)].iterrows(): )將始終檢索原始的Total值(它不會看到一周的更新,同時處理下周的行(假設這兩行最初都包含0 ))。
另一個備注
假設您的行按Date / Time排序,您的原始代碼應該:
所以這段代碼實際上應該是data.loc[(Index_Zero[i] - 168), 'Total'] 。
但是我的解決方案對 DataFrame 中任何丟失的行都有抵抗力,所以我建議采用我的解決方案。
這就是我認為的問題所在。 您正在將data.loc[(Index_Zero[i]), 'Total']
的值替換為 Index_zero 列表中 index(i+168) 處的值,該值始終為 0。(您正是為此維護了該列表)。 我認為這是一個無辜的錯誤。
將您的代碼更改為此
Index_Zero = data[data["Total"]==0].index.to_list() #Output = list of indexes where all the zeros lie
print(Index_Zero[0]) #Output = 2
for i in Index_Zero:
data.loc[(Index_Zero[i]), 'Total']=data.loc[(i+168), 'Total']
問題出在 for 循環的范圍內。 它正在迭代超出列表。
Index_Zero = data[data["Total"]==0].index.to_list()
for items in range(0, len(Index_Zero)-1):
data.loc[(Index_Zero[items]), 'Total'] = data.loc[(items+168), 'Total']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.