我一直在寻找通过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')]
我觉得解决方案非常简单,但我无法解决这个错误。谢谢!
答案 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(最终将其丢弃并进行垃圾回收)以计算最终结果范围-我们理想上要避免的事情。
最后,只要可以选择的列数很少,“直接选择列”是一个很好的建议。但是,在某些范围跨越数十个(或可能数百个)列的情况下,它将不适用。