python - Pandas 使用 MultiIndex 切片数据

标签 python pandas slice multi-index

我有一些功能想要写入一些 csv 文件。如果可能的话,我想使用 pandas 来实现这种方法。
我按照 here 中的说明进行操作并创建了一些虚拟数据来检查它。基本上有一些事件具有随机数量的特征。

import io
data = io.StringIO('''Activity,id,value,value,value,value,value,value,value,value,value
Run,1,1,2,2,5,6,4,3,2,1
Run,1,2,4,4,10,12,8,6,4,2
Stand,2,1.5,3.,3.,7.5,9.,6.,4.5,3.,1.5
Sit,3,0.5,1.,1.,2.5,3.,2.,1.5,1.,0.5
Sit,3,0.6,1.2,1.2,3.,3.6,2.4,1.8,1.2,0.6
Run, 2, 0.8, 1.6, 1.6, 4. , 4.8, 3.2, 2.4, 1.6, 0.8
''')
df_unindexed = pd.read_csv(data)
df = df_unindexed.set_index(['Activity', 'id'])

当我运行时:

df.xs('Run')

我明白

    value  value.1  value.2  value.3  value.4  value.5  value.6  value.7  \
id                                                                         
1     1.0      2.0      2.0      5.0      6.0      4.0      3.0      2.0   
1     2.0      4.0      4.0     10.0     12.0      8.0      6.0      4.0   
2     0.8      1.6      1.6      4.0      4.8      3.2      2.4      1.6   
    value.8  
id           
1       1.0  
1       2.0  
2       0.8 

这几乎就是我想要的,这就是所有 run 事件。我想删除第一行和第一列,即标题和 id 列。我如何实现这一目标?

第二个问题是,当我只想要一项事件时,如何获得它。
使用时

idx = pd.IndexSlice
df.loc[idx['Run', 1], :]

给出

             value  value.1  value.2  value.3  value.4  value.5  value.6  \
Activity id                                                                
Run      1     1.0      2.0      2.0      5.0      6.0      4.0      3.0   
         1     2.0      4.0      4.0     10.0     12.0      8.0      6.0   
             value.7  value.8  
Activity id                    
Run      1       2.0      1.0  
         1       4.0      2.0  

但是切片并没有像我预期的那样工作。例如尝试

df.loc[idx['Run', 1], 2:11]

反而会产生错误:

TypeError: cannot do slice indexing on with these indexers [2] of 'int'>

那么,我如何在这个地方获得我的功能呢?

附注如果不清楚,我是 Pandas 的新手,所以要温柔。此外,id 列可以编辑为每个事件或整个数据集唯一的(如果这使事情变得更容易等)

最佳答案

您可以使用一点技巧 - 按位置获取列名称,因为 iloc对于 MultiIndex 尚未 supported :

print (df.columns[2:11])
Index(['value.2', 'value.3', 'value.4', 'value.5', 'value.6', 'value.7',
       'value.8'],
      dtype='object')

idx = pd.IndexSlice
print (df.loc[idx['Run', 1], df.columns[2:11]])
             value.2  value.3  value.4  value.5  value.6  value.7  value.8
Activity id                                                               
Run      1       2.0      5.0      6.0      4.0      3.0      2.0      1.0
         1       4.0     10.0     12.0      8.0      6.0      4.0      2.0

如果想将文件保存为不带索引和列的 csv:

df.xs('Run').to_csv(file, index=False, header=None)

关于python - Pandas 使用 MultiIndex 切片数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50288315/

相关文章:

python - 使用 Pandas 转换年度数据

python - 如何遍历 pandas Dataframe 中的每个单元格?

javascript - 如何使用 flask [使用 flask 示例] 将 javascript 数组传递给 python 脚本

python - 389 目录服务器测试与 lib389

python - 为什么 Anaconda for Windows 安装不正确?

python - 与 pandas 系列切片的混淆

python - python列表中的不连续切片

python - SQLAlchemy - 执行存储过程并填充类

python - 取两个日期时间值或列的中值

python - 掩码二维数组保持形状