pandas multiindex - 如何在使用列时选择第二级?

时间:2017-07-16 12:20:23

标签: python-3.x pandas

愚蠢的问题,但我真的找不到答案。 我有一个包含此索引的数据框:

index = pd.MultiIndex.from_product([['stock1','stock2'...],['price','volume'...]])

这是一个有用的结构,可以df['stock1'],但如何选择所有价格数据?我无法理解文档。

我已经尝试了以下但没有运气:df[:,'price'] df[:]['price'] df.loc(axis=1)[:,'close'] df['price]

如果无论出于何种原因,这种指数风格一般都被认为是一个坏主意,那么什么是更好的选择呢?我应该将股票的多指数指数作为时间序列上的标签而不是列级别吗?

非常感谢

编辑 - 我使用的是多索引用的列,而不是索引(措辞对我来说更好)。文档中的示例侧重于多级索引而不是列结构。

5 个答案:

答案 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)

使用@JohnZwinck's data sample

[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中的第二列的最直观的解决方案是将.locslice()一起使用。

如果您的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. 

希望这会有所帮助,如果我完全误解了你的问题,我总是随意跟进这个答案,我很乐意进一步提供帮助。

相关问题