按标签(pandas)选择多个列

Min*_*Mai 34 python pandas

我一直在寻找通过python文档和论坛选择列的方法,但索引列上的每个示例都过于简单.

假设我有一个10 x 10的数据帧

df = DataFrame(randn(10, 10), index=range(0,10), columns=['A', 'B', 'C', 'D','E','F','G','H','I','J'])
Run Code Online (Sandbox Code Playgroud)

到目前为止,所有文档都只是一个索引的简单例子

subset = df.loc[:,'A':'C']
Run Code Online (Sandbox Code Playgroud)

要么

subset = df.loc[:,'C':]
Run Code Online (Sandbox Code Playgroud)

但是当我尝试索引多个非顺序列时,我得到一个错误,就像这样

subset = df.loc[:,('A':'C', 'E')]
Run Code Online (Sandbox Code Playgroud)

如果我想从A到C,E和G中选择A列,我将如何在Pandas中编入索引?看来这个逻辑不起作用

subset = df.loc[:,('A':'C', 'E', 'G':'I')]
Run Code Online (Sandbox Code Playgroud)

我觉得解决方案非常简单,但我无法解决这个错误.谢谢!

Joh*_*hnE 41

基于名称或标签(使用正则表达式语法)

df.filter(regex='[A-CEG-I]')   # does NOT depend on the column order
Run Code Online (Sandbox Code Playgroud)

基于位置(取决于列顺序)

df[ list(df.loc[:,'A':'C']) + ['E'] + list(df.loc[:,'G':'I']) ]
Run Code Online (Sandbox Code Playgroud)

请注意,与基于标签的方法不同,这仅适用于按行按字母顺序排序的列.然而,这不一定是个问题.例如,如果你的列是['A','C','B'],那么你可以用'A':'C'上面的替换'A':'B'.

漫长的道路

为了完整起见,您总是可以让@Magdalena显示单独列出每列的选项,尽管随着列数的增加可能会更加冗长:

df[['A','B','C','E','G','H','I']]   # does NOT depend on the column order
Run Code Online (Sandbox Code Playgroud)

任何上述方法的结果

          A         B         C         E         G         H         I
0 -0.814688 -1.060864 -0.008088  2.697203 -0.763874  1.793213 -0.019520
1  0.549824  0.269340  0.405570 -0.406695 -0.536304 -1.231051  0.058018
2  0.879230 -0.666814  1.305835  0.167621 -1.100355  0.391133  0.317467
Run Code Online (Sandbox Code Playgroud)


小智 21

只需直接选择您想要的列....

df[['A','E','I','C']]
Run Code Online (Sandbox Code Playgroud)

  • 因为:尝试在DataFrame的切片副本上设置值.尝试使用.loc [row_indexer,col_indexer] = value,请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy (3认同)
  • 不明白为什么这不被标记为已接受的答案.其他答案似乎很复杂 (2认同)
  • 只有当您希望读取而不是写入数据帧的结果子集时,证明这个简单的解决方案才有效会很有帮助。OP 没有澄清读与写的意图。 (2认同)