首页 > 解决方案 > 在`unstack`和`set_index`之后切片

问题描述

我有一个关于使用后切片的简单问题unstack

我的纵向/面板数据集采用以下longfile形式(数据输入代码在问题下方)。

    time x  y
USA 1    5  10
USA 2    5  12
USA 3    6  13
CAN 1    2  2
CAN 2    2  3
CAN 3    4  5

然后我unstack将数据放入一个widefile,按时间索引,如下:

df1 = df.reset_index().set_index(['time','index']).unstack(-1)
print(df1)

这使

        x       y    
index CAN USA CAN USA
time                 
1       2   5   2  10
2       2   5   3  12
3       4   6   5  13

我现在想根据时间对宽文件进行切片,df1以便:

我试过这个:

train = df1[(df.time=='1')|(df.time=='2')]

还有这个:

train = df1[(df.time==1)|(df.time==2)]

但两者都给出错误。

我想要的输出是:

train

        x       y    
index CAN USA CAN USA
time                 
1       2   5   2  10
2       2   5   3  12

test

        x       y    
index CAN USA CAN USA
time                 
3       4   6   5  13

数据输入代码

import numpy as np
import pandas as pd

data = np.array([['country','time','x','y'],
                ['USA',1, 5, 10],
                ['USA',2, 5, 12],
                ['USA',3,6, 13],
                ['CAN',1,2, 2],
                ['CAN',2,2, 3],
                ['CAN',3,4, 5]],                
               )
                
df = pd.DataFrame(data=data[1:,1:],
                  index=data[1:,0],
                  columns=data[0,1:])

df

标签: pythonpandasnumpy

解决方案


首先timeindex名称,所以它index不再是列,我们需要使用.index,第二你需要使用df1df

train = df1[df1.index.isin([1,2])]
train
Out[219]: 
        x       y    
index CAN USA CAN USA
time                 
1       2   5   2  10
2       2   5   3  12

推荐阅读