簡體   English   中英

如何按列值過濾 multiIndexed pandas DataFrame

[英]How do I filter multiIndexed pandas DataFrame by a column value

給定股票價格的 DataFrame,我有興趣根據最新收盤價進行過濾。 我知道如何為簡單的 DataFrame 執行此操作,但無法弄清楚如何為多索引 dataframe 執行此操作。

簡單 dataframe:

              AAPL     AMZN     GOOG    MSFT
2021-02-08  136.91  3322.94  2092.91  242.47
2021-02-09  136.01  3305.00  2083.51  243.77
2021-02-10  135.39  3286.58  2095.38  242.82
2021-02-11  135.13  3262.13  2095.89  244.49
2021-02-12  135.37  3277.71  2104.11  244.99

操作: df.loc[:,df.iloc[-1] < 250]

Output:

              AAPL    MSFT
2021-02-08  136.91  242.47
2021-02-09  136.01  243.77
2021-02-10  135.39  242.82
2021-02-11  135.13  244.49
2021-02-12  135.37  244.99

但是我無法弄清楚如何在帶有 MultiIndex(例如 OHLC)的 DataFrame 上完成此操作

多索引 DataFrame:

             Close                              High                               Low  ...            Open                              Volume                            
              AAPL     AMZN     GOOG    MSFT    AAPL     AMZN     GOOG    MSFT    AAPL  ...    MSFT    AAPL     AMZN     GOOG    MSFT      AAPL     AMZN     GOOG      MSFT
2021-02-08  136.91  3322.94  2092.91  242.47  136.96  3365.00  2123.55  243.68  134.92  ...  240.81  136.03  3358.50  2105.91  243.15  71297200  3257400  1241900  22211900
2021-02-09  136.01  3305.00  2083.51  243.77  137.88  3338.00  2105.13  244.76  135.85  ...  241.38  136.62  3312.49  2078.54  241.87  76774200  2203500   889900  23565000
2021-02-10  135.39  3286.58  2095.38  242.82  136.99  3317.95  2108.37  245.92  134.40  ...  240.89  136.48  3314.00  2094.21  245.00  73046600  3151600  1135500  22186700
2021-02-11  135.13  3262.13  2095.89  244.49  136.39  3292.00  2102.03  245.15  133.77  ...  242.15  135.90  3292.00  2099.51  244.78  64280000  2301400   945700  15751100
2021-02-12  135.37  3277.71  2104.11  244.99  135.53  3280.25  2108.82  245.30  133.69  ...  242.73  134.35  3250.00  2090.25  243.93  60029300  2329300   855700  16552000

[5 rows x 20 columns]

過濾器: df_filter = df.iloc[-1].loc['Close'] < 250

AAPL     True
AMZN    False
GOOG    False
MSFT     True
Name: 2021-02-12 00:00:00, dtype: bool

手術???:

也許像df.loc[:,filter]但我收到錯誤:

pandas.core.indexing.IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match)

我知道這是一個多索引,所以我也嘗試使用pd.IndexSlicedf.loc[:,idx[:,df_filter]]但仍然得到:

ValueError: cannot index with a boolean indexer that is not the same length as the index

所需的 Output:

             Close            High             Low            Open            Volume          
              AAPL    MSFT    AAPL    MSFT    AAPL    MSFT    AAPL    MSFT      AAPL      MSFT
2021-02-08  136.91  242.47  136.96  243.68  134.92  240.81  136.03  243.15  71297200  22211900
2021-02-09  136.01  243.77  137.88  244.76  135.85  241.38  136.62  241.87  76774200  23565000
2021-02-10  135.39  242.82  136.99  245.92  134.40  240.89  136.48  245.00  73046600  22186700
2021-02-11  135.13  244.49  136.39  245.15  133.77  242.15  135.90  244.78  64280000  15751100
2021-02-12  135.37  244.99  135.53  245.30  133.69  242.73  134.35  243.93  60029300  16552000

我不確定IndexSlice是否適用於 boolean 索引。 您可以嘗試傳遞有效的索引:

df.loc[:,pd.IndexSlice[:, df_filter.index[df_filter]]]

暫無
暫無

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

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