愚蠢的问题,但我真的找不到答案。 我有一个包含此索引的数据框:
index = pd.MultiIndex.from_product([['stock1','stock2'...],['price','volume'...]])
这是一个有用的结构,可以df['stock1']
,但如何选择所有价格数据?我无法理解文档。
我已经尝试了以下但没有运气:df[:,'price']
df[:]['price']
df.loc(axis=1)[:,'close']
df['price]
如果无论出于何种原因,这种指数风格一般都被认为是一个坏主意,那么什么是更好的选择呢?我应该将股票的多指数指数作为时间序列上的标签而不是列级别吗?
非常感谢
编辑 - 我使用的是多索引用的列,而不是索引(措辞对我来说更好)。文档中的示例侧重于多级索引而不是列结构。
答案 0 :(得分:27)
还使用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
或者,如果您有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
答案 1 :(得分:22)
[0-9a-z]
选项1:
var express = require("express");
var app = express();
const request = require('request');
const options = {
url: 'https://jsonplaceholder.typicode.com/posts',
method: 'GET',
headers: {
'Accept': 'application/json',
'Accept-Charset': 'utf-8',
'User-Agent': 'my-reddit-client'
}
};
app.get("/api", function(req, res) {
request(options, function(err, output, body) {
var json = JSON.parse(body);
console.log(json); // Logging the output within the request function
res.json(json) //then returning the response.. The request.json is empty over here
}); //closing the request function
});
app.listen(3000, function() {
console.log("My API is running...");
});
module.exports = app;
选项2:
In [132]: df
Out[132]:
0
stock1 price 1
volume 2
stock2 price 3
volume 4
stock3 price 5
volume 6
答案 2 :(得分:3)
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())
给你:
0
price volume
stock1 1 2
stock2 3 4
stock3 5 6
答案 3 :(得分:0)
我发现访问带有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
使用df.loc[:, (slice(None), "price")]
将提供所有带有"price"
子列的列
stock1 stock2 stock3
price price price
0 1 3 5
1 2 4 6
在df.loc[:, (slice(None), "price")]
内,位置:
的第一个参数传递所有行的结果,第二个参数(slice(None), "price")
是一个元组,负责选择所有第一级列(slice(None)
)以及名称为"price"
的所有第二级列。
答案 4 :(得分:-1)
我也注意到你错过了这个选项:
df.loc[:,"price"]
就时间数据的最佳实践而言,将其保存在与行对应的列中,最好作为Python中的日期时间对象(pandas内置了对它的功能支持)。您可以使用掩码语法来获取与您感兴趣的时间相关的时间。
这就是您访问数据框的单个列的方式。但是对于多列,我们可以传递一个列表或一个冒号来获取所有:
df.loc[:,["price","volume"]]
#or
df.loc[:,:]
查询(并快速)的一种有用方法是使用掩码来指定哪些行/列符合您想要的条件:
Mask=df.loc[:,"price"]>50.0
df.loc[Mask, "stock"] #should return the stock prices greater than 50bucks.
希望这会有所帮助,如果我完全误解了你的问题,我总是随意跟进这个答案,我很乐意进一步提供帮助。