簡體   English   中英

在 Pandas 數據框中填寫過去一周的數據(之前的 168 個索引)中的零

[英]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

我認為,更自然的解決方案是:

  • 將索引設置為 "true" datetime ,派生自日期時間列。
  • Total == 0的行索引上運行循環。
    • 從索引 1 周前的行中檢索值。
    • 在具有當前索引的行中將此值保存為Total
  • 最后將索引重置為之前的值。

要執行此操作,請運行:

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排序,您的原始代碼應該:

  • 參考當前指數減去168(一周,不是一周)。
  • 提到的減法 od 168應該從當前索引( Index_Zero[i] )中完成。

所以這段代碼實際上應該是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM