簡體   English   中英

通過 prod() 重新采樣 datetimeindex function 將 NaN 更改為 1

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

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