上下文
所以我正在迭代一堆文件,其中每个文件都是一个主题,并且在每个文件中有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访问?
答案 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_)