熊猫数据透视表子集

时间:2015-04-24 00:31:19

标签: python pandas

我的数据透视表如下所示:

In [13]: df.groupby(["item", "color"])["id"].transform("count")
Out[13]:
0    2
1    2
2    2
3    1
4    2
dtype: int64

如何针对特定日期和特定列值进行子集化,比如关闭所有符号的价格?

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']为我提供符号SPY的整个表值。

2 个答案:

答案 0 :(得分:2)

您可以使用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')]

或者,您可以使用pt.ix作为Andy Hayden的建议,但请注意,如果pt有 一个整数值索引,然后pt.ix执行基于标签的行索引,而不是 序数索引。

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

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

请注意chained indexing,例如

pt.iloc[i].loc[(slice(None), 'Close')]
执行分配时应避免使用

,因为使用链式索引进行分配可能无法修改pt

答案 1 :(得分:2)

另一种方法是使用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)要弱一些。