And*_*ore 30 python-3.x pandas
愚蠢的问题,但我真的找不到答案.我有一个包含此索引的数据框:
index = pd.MultiIndex.from_product([['stock1','stock2'...],['price','volume'...]])
Run Code Online (Sandbox Code Playgroud)
这是一个有用的结构df['stock1']
,但我如何选择所有价格数据?我无法理解文档.
我试过以下没有运气: df[:,'price']
df[:]['price']
df.loc(axis=1)[:,'close']
df['price]
如果无论出于何种原因,这种索引风格一般都被认为是一个坏主意,那么什么是更好的选择呢?我应该将股票的多指数指数作为时间序列上的标签而不是列级别吗?
非常感谢
编辑 - 我使用multiindex作为列,而不是索引(措辞对我来说更好).文档中的示例侧重于多级索引而不是列结构.
And*_*w L 35
还使用John的数据样本:
使用xs()
是切片的另一种方法MultiIndex
:
df
0
stock1 price 1
volume 2
stock2 price 3
volume 4
stock3 price 5
volume 6
df.xs('price', level=1, drop_level=False)
0
stock1 price 1
stock2 price 3
stock3 price 5
Run Code Online (Sandbox Code Playgroud)
或者,如果您有一个MultiIndex
代替列:
df
stock1 stock2 stock3
price volume price volume price volume
0 1 2 3 4 5 6
df.xs('price', axis=1, level=1, drop_level=False)
stock1 stock2 stock3
price price price
0 1 3 5
Run Code Online (Sandbox Code Playgroud)
Max*_*axU 30
In [132]: df
Out[132]:
0
stock1 price 1
volume 2
stock2 price 3
volume 4
stock3 price 5
volume 6
Run Code Online (Sandbox Code Playgroud)
选项1:
In [133]: df.loc[(slice(None), slice('price')), :]
Out[133]:
0
stock1 price 1
stock2 price 3
stock3 price 5
Run Code Online (Sandbox Code Playgroud)
选项2:
In [134]: df.loc[pd.IndexSlice[:, 'price'], :]
Out[134]:
0
stock1 price 1
stock2 price 3
stock3 price 5
Run Code Online (Sandbox Code Playgroud)
YPO*_*POC 17
我发现访问具有 MultiIndex 列的 DataFrame 中的二级列的最直观的解决方案是.loc
与 一起使用slice()
。
如果你的 DataFrame 带有
df
stock1 stock2 stock3
price volume price volume price volume
0 1 2 3 4 5 6
1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
使用df.loc[:, (slice(None), "price")]
将提供带有子列的所有列"price"
stock1 stock2 stock3
price price price
0 1 3 5
1 2 4 6
Run Code Online (Sandbox Code Playgroud)
在df.loc[:, (slice(None), "price")]
loc 的第一个参数中:
,传递所有行的结果,第二个参数(slice(None), "price")
是一个元组,负责选择所有第一级列 ( slice(None)
) 和名称为 的所有第二级列"price"
。
df.unstack()
将“撕掉”您的最后一层MultiIndex
并使您的 DataFrame 更加传统,每种类型的数据只有一列。例如:
index = pd.MultiIndex.from_product([['stock1','stock2','stock3'],['price','volume']])
df = pd.DataFrame([1,2,3,4,5,6], index)
print(df.unstack())
Run Code Online (Sandbox Code Playgroud)
给你:
0
price volume
stock1 1 2
stock2 3 4
stock3 5 6
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24924 次 |
最近记录: |