将数据帧的pandas concat转换为multiindex

时间:2017-11-15 15:08:23

标签: python pandas

上下文

所以我正在迭代一堆文件,其中每个文件都是一个主题,并且在每个文件中有3列,每列代表某一点的x,y,z轴(文件的长度不是相同)。我想将所有这些都放入多指数PD df。

我尝试了什么

我找到了this post,当我这样做时,似乎有效

d_ = dict()
DATA_ROOT = "../sample_data/chest_mounted/"
cutoff_min = 0
for fileName in os.listdir(DATA_ROOT):
    if ".csv" in fileName and '.swp' not in fileName:
        with open(DATA_ROOT + fileName) as f:
            data = np.asarray(list(map(lambda x: x.strip().split(",")[1:-1], f.readlines())), dtype=np.int)
            subj_key = "Subject_" + str(fileName.split(".")[0])
            d_[subj_key] = pd.DataFrame(data, columns=['x_acc', 'y_acc', 'z_acc'])
df = pd.concat(d_.values(), keys=d_.keys())

当我做df.head()时,它看起来就像我想要的那样(我想?)

                x_acc   y_acc   z_acc
Subject_1   0   1502    2215    2153
            1   1667    2072    2047
            2   1611    1957    1906
            3   1601    1939    1831
            4   1643    1965    1879

问题

然而,当我尝试按Subject_x索引时,我收到错误。相反,我必须首先做一些像

这样的事情
df["x_acc"]["Subject_1"] 

我首先访问x_acc然后访问Subject_1。

问题

1)我的印象是我正在创建一个多索引,但尝试df["x_acc"]["Subject_1"]似乎并非如此。我该如何将其转换为那个?

2)有没有办法改变索引,以便我先通过Subject访问?

1 个答案:

答案 0 :(得分:2)

使用loc进行选择 - 首先按级别MultiIndex,然后按列名称或xs进行简单选择:

df = df.loc['Subject_1', 'x_acc']
print (df)
0    1502
1    1667
2    1611
3    1601
4    1643
Name: x_acc, dtype: int64

df = df.xs('Subject_1')
print (df)
   x_acc  y_acc  z_acc
0   1502   2215   2153
1   1667   2072   2047
2   1611   1957   1906
3   1601   1939   1831
4   1643   1965   1879

对于更复杂的选择,请使用slicers

idx = pd.IndexSlice

df = df.loc['Subject_1', idx['x_acc','y_acc']]
print (df)
   x_acc  y_acc
0   1502   2215
1   1667   2072
2   1611   1957
3   1601   1939
4   1643   1965

此外,您的代码似乎应该由read_csv简化:

d_ = dict()
DATA_ROOT = "../sample_data/chest_mounted/"
cutoff_min = 0
for fileName in os.listdir(DATA_ROOT):
    if ".csv" in fileName and '.swp' not in fileName:
        subj_key = "Subject_" + str(fileName.split(".")[0])
        d_[subj_key] = pd.read_csv(fileName,  names=['x_acc', 'y_acc', 'z_acc'])

df = pd.concat(d_)