簡體   English   中英

Pandas 基於掩模條件的滾動計算?

[英]Pandas rolling calculation based on a mask condition?

我有一個 dataframe 格式如下:

>>> df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
     A   B   C   D
0   58   3  25  94
1   54   4  99  85
2   87  98  74  36
3   63  68  79  51
4   25   7  42  12
..  ..  ..  ..  ..
95  50  19  90  99
96  68   1  52  98
97  96   2  98  21
98  90  25   5  23
99  56  93  48  19

我想重新計算那些符合特定標准的值。 可以有很多標准,但為了簡單起見,我們只取一個簡單的:如果一個單元格值低於 dataframe 平均值的 10%:

>>> mask = df<0.1*df.mean().mean()
        A      B      C      D
0   False   True  False  False
1   False   True  False  False
2   False  False  False  False
3   False  False  False  False
4   False  False  False  False
..    ...    ...    ...    ...
95  False  False  False  False
96  False   True  False  False
97  False   True  False  False
98  False  False   True  False
99  False  False  False  False

對於滿足此條件的每個單元格,我想創建一個大小為 10 的滾動 window,計算滾動 window 的平均值,並用該平均值替換單元格的值。 對於原始df dataframe中單元格的所有rest,應保留原始值。 因此我們可以直觀地認為:如果我們看到一個太低的值,讓我們用最后 10 個(實際上只有 9 個,由於 pandas 中定義滾動 window 的方式)值的平均值來替換它。

現在我有點如何從這里前進。 df[mask]將向我顯示滿足條件的單元格,但我無法對其應用.rolling() ,因為df[mask]在所有其他不滿足條件的單元格中都有NaN

請注意,我更喜歡高性能,因為實際上標准和滾動 window 計算會更復雜,而 dataframe 更大。 因此我可以做一個簡單的 for 循環類型的查找,但這不適合我對這個用例的需求。

如果我正確理解了這個問題:

mask = df < 0.1 * df.mean().mean()
df[mask] = df.rolling(10, 0).mean()[mask]

取決於您希望如何處理 NaN,但一種方法很簡單:df[mask].fillna(0).rolling(10).mean()

我設法通過扭轉問題來做到這一點:我沒有專注於弄清楚如何對符合標准的單元格執行滾動 window 計算,而是首先計算了整個 dataframe 的滾動平均值:

>>> means = df.rolling(10).mean()
       A     B     C     D
0    NaN   NaN   NaN   NaN
1    NaN   NaN   NaN   NaN
2    NaN   NaN   NaN   NaN
3    NaN   NaN   NaN   NaN
4    NaN   NaN   NaN   NaN
..   ...   ...   ...   ...
95  46.3  35.2  44.8  41.5
96  46.1  40.0  42.0  48.0
97  49.6  45.6  42.8  52.6
98  46.7  39.5  40.3  49.9
99  43.6  42.5  35.9  46.7

然后,我簡單地將df[mask] where mask = df<0.1*df.mean()*mean() means給它,如下所示:

df[mask] = means 

這將保留maskFalse的原始df單元格值,但如果maskTrue ,則將其替換為來自means的相應單元格值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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