簡體   English   中英

熊貓數據透視表子集

[英]Pandas Pivot Table Subsetting

我的數據透視表如下所示:

Symbol     DIA   QQQ        SPY   XLE   DIA   QQQ        SPY   XLE  DIA  QQQ  \
          Open  Open       Open  Open  High  High       High  High  Low  Low   
Date                                                                           
19930129   NaN   NaN  29.083294   NaN   NaN   NaN  29.083294   NaN  NaN  NaN   
19930201   NaN   NaN  29.083294   NaN   NaN   NaN  29.269328   NaN  NaN  NaN   
19930202   NaN   NaN  29.248658   NaN   NaN   NaN  29.352010   NaN  NaN  NaN   
19930203   NaN   NaN  29.372680   NaN   NaN   NaN  29.662066   NaN  NaN  NaN   
19930204   NaN   NaN  29.744748   NaN   NaN   NaN  29.827430   NaN  NaN  NaN   

Symbol          SPY  XLE    DIA    QQQ        SPY    XLE           DIA  \
                Low  Low  Close  Close      Close  Close  Total Volume   
Date                                                                     
19930129  28.938601  NaN    NaN    NaN  29.062624    NaN           NaN   
19930201  29.083294  NaN    NaN    NaN  29.269328    NaN           NaN   
19930202  29.186647  NaN    NaN    NaN  29.331340    NaN           NaN   
19930203  29.352010  NaN    NaN    NaN  29.641396    NaN           NaN   
19930204  29.414021  NaN    NaN    NaN  29.765419    NaN           NaN   

Symbol             QQQ           SPY           XLE  
          Total Volume  Total Volume  Total Volume  
Date                                                
19930129           NaN         15167           NaN  
19930201           NaN          7264           NaN  
19930202           NaN          3043           NaN  
19930203           NaN          8004           NaN  
19930204           NaN          8035           NaN 

如何對特定的一天和特定的列值進行子集設置,例如關閉所有交易品種的價格?

19930129 NaN NaN 29.062624 NaN

我嘗試了pt['Close'] ,但似乎沒有用。 只有pt['SPY']給出了符號SPY的整個表值。

您可以使用pd.IndexSlice

pt = pt.sortlevel(axis=1)
pt.loc['19930129', pd.IndexSlice[:,'Close']]

使用IndexSlicer需要對選擇軸進行完全lexsorted,因此要調用sortlevel

另外, slice(None)也可以用於從第一列索引級別選擇所有內容:

pt = pt.sortlevel(axis=1)
pt.loc['19930129', (slice(None), 'Close')]

要選擇第ith行,但按標簽選擇列,則可以使用

pt.loc[pt.index[i], (slice(None), 'Close')]

或者,您可以按照Andy Hayden的建議使用pt.ix ,但要注意,如果pt具有整數索引,則pt.ix執行基於標簽的行索引,而不是順序索引。

因此,只要19930129 (和其他索引值)不是整數-即pt.index不是Int64Index您可以使用

pt.ix[i, (slice(None), 'Close')]

請注意, 鏈式索引 ,例如

pt.iloc[i].loc[(slice(None), 'Close')]

執行分配時應避免使用,因為具有鏈接索引的分配可能無法修改pt

一種替代方法是使用xs ,“橫截面”:

In [21]: df.xs(axis=1, level=1, key="Open")
Out[21]:
Symbol    DIA  QQQ        SPY  XLE
Date
19930129  NaN  NaN  29.083294  NaN
19930201  NaN  NaN  29.083294  NaN
19930202  NaN  NaN  29.248658  NaN
19930203  NaN  NaN  29.372680  NaN
19930204  NaN  NaN  29.744748  NaN

In [22]: df.xs(axis=1, level=1, key="Open").loc[19930129]
Out[22]:
Symbol
DIA          NaN
QQQ          NaN
SPY    29.083294
XLE          NaN
Name: 19930129, dtype: float64

這沒有unutbu的答案強大(使用IndexSlice)。

暫無
暫無

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

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