[英]resample datetimeindex via prod() function changes NaN to 1
我正在處理一個相當大的數據集。 在結合轉換方法“prod”(乘法)應用 resample 命令后,我意識到我的 NaN 值已更改為 1,這不是我想要的。 舉個例子:
# build random dataframe with one column containing NaN
import pandas as pd
import numpy as np
index = pd.date_range('1/1/2000', periods=7, freq='d')
df = pd.DataFrame(index = index, columns = ["Score 1", "Score 2", "Score 3"])
df["Score 1"] = np.random.randint(1,20,size=7)
df["Score 2"] = np.random.randint(1,20,size=7)
df["Score 3"] = [1, 2, 3, np.NaN, np.NaN, np.NaN, np.NaN]
print(df)
Score 1 Score 2 Score 3
2000-01-01 6 7 1.0
2000-01-02 2 15 2.0
2000-01-03 8 19 3.0
2000-01-04 14 19 NaN
2000-01-05 17 8 NaN
2000-01-06 15 6 NaN
2000-01-07 12 18 NaN
現在假設我想使用“prod”轉換方法將我的 Dataframe 從每日頻率重新采樣到 3 天頻率。 我這樣做是:
df.resample("3d").agg("prod")
print(df)
Score 1 Score 2 Score 3
2000-01-01 96 1995 6.0
2000-01-04 3570 2052 1.0
2000-01-07 12 18 1.0
看着“Score 3”一欄,我的 NaN 值突然變成了 1,這讓我很意外。 這意味着當 NaN 彼此相乘時,我會得到 =1。 有誰知道為什么 NaN 的乘法等於 1,如果 NaN 與自身相乘,我可以做些什么來保持它的值?
在此先感謝,非常感謝任何幫助
pandas.DataFrame.prod
function ( docs ) 默認將NaN
設置為 1:
pd.Series([np.NaN, np.NaN]).prod()
# 1.0
您可以通過設置相應的關鍵字來規避這種情況:
pd.Series([np.NaN, np.NaN]).prod(skipna=False)
# nan
在您的情況下,您可以將其應用為
print(df)
Score 1 Score 2 Score 3
2000-01-01 18 19 1.0
2000-01-02 9 18 2.0
2000-01-03 10 4 3.0
2000-01-04 4 15 4.0
2000-01-05 12 1 NaN
2000-01-06 1 3 NaN
2000-01-07 8 9 NaN
print(df.resample("3d").agg(pd.DataFrame.prod, skipna=False))
Score 1 Score 2 Score 3
2000-01-01 1620 1368 6.0
2000-01-04 48 45 NaN
2000-01-07 8 9 NaN
請注意,如果 window 包含至少一個NaN
值,這會將所有重采樣時間 windows 設置為NaN
- 我稍微更改了示例df
以顯示這一點。 您可以apply
lambda
代替,檢查是否至少一個元素不是NaN
:
print(df.resample("3d").apply(lambda x: x.prod() if any(x.notnull()) else np.nan))
Score 1 Score 2 Score 3
2000-01-01 1620 1368 6.0
2000-01-04 48 45 4.0
2000-01-07 8 9 NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.