按标签(pandas)选择多个列

时间:2015-03-24 20:03:23

标签: 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'])

到目前为止,所有文档都只是一个像

这样的索引的简单示例
subset = df.loc[:,'A':'C']

subset = df.loc[:,'C':]

但是当我尝试索引多个非顺序列时,我得到一个错误,比如

subset = df.loc[:,('A':'C', 'E')]

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

subset = df.loc[:,('A':'C', 'E', 'G':'I')]

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

3 个答案:

答案 0 :(得分:36)

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

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

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

df[ list(df.loc[:,'A':'C']) + ['E'] + list(df.loc[:,'G':'I']) ]

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

漫长道路

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

df[['A','B','C','E','G','H','I']]   # does NOT depend on the column order

任何上述方法的结果

          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

答案 1 :(得分:15)

直接选择你想要的列....

df[['A','E','I','C']]

答案 2 :(得分:3)

如何在熊猫中按标签选择多列?

大熊猫不容易支持基于标签的多个范围切片,但是基于位置的切片可以轻松支持,所以让我们尝试一下:

loc = df.columns.get_loc
df.iloc[:, np.r_[loc('A'):loc('C')+1, loc('E'), loc('G'):loc('I')+1]]

          A         B         C         E         G         H         I
0 -1.666330  0.321260 -1.768185 -0.034774  0.023294  0.533451 -0.241990
1  0.911498  3.408758  0.419618 -0.462590  0.739092  1.103940  0.116119
2  1.243001 -0.867370  1.058194  0.314196  0.887469  0.471137 -1.361059
3 -0.525165  0.676371  0.325831 -1.152202  0.606079  1.002880  2.032663
4  0.706609 -0.424726  0.308808  1.994626  0.626522 -0.033057  1.725315
5  0.879802 -1.961398  0.131694 -0.931951 -0.242822 -1.056038  0.550346
6  0.199072  0.969283  0.347008 -2.611489  0.282920 -0.334618  0.243583
7  1.234059  1.000687  0.863572  0.412544  0.569687 -0.684413 -0.357968
8 -0.299185  0.566009 -0.859453 -0.564557 -0.562524  0.233489 -0.039145
9  0.937637 -2.171174 -1.940916 -1.553634  0.619965 -0.664284 -0.151388

请注意,添加+1是因为使用iloc时最右边的索引是排他的。


对其他解决方案的评论

  • filter是用于OP的标头的一种很好且简单的方法,但这可能不能很好地推广到任意列名。

  • 使用loc的“基于位置”的解决方案更接近理想状态,但是您无法避免创建中间DataFrame(最终将其丢弃并进行垃圾回收)以计算最终结果范围-我们理想上要避免的事情。

  • 最后,只要可以选择的列数很少,“直接选择列”是一个很好的建议。但是,在某些范围跨越数十个(或可能数百个)列的情况下,它将不适用。