当列名是整数时,按列号索引pandas DataFrame

时间:2014-11-26 18:19:31

标签: python pandas

我试图保留DataFrame的某些列,当列名是字符串时它可以正常工作:

In [2]: import numpy as np

In [3]: import pandas as pd

In [4]: a = np.arange(35).reshape(5,7)

In [5]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], ['a', 'b', 'c', 'd', 'e', 'f', 'g'])

In [6]: df
Out[6]: 
    a   b   c   d   e   f   g
x   0   1   2   3   4   5   6
y   7   8   9  10  11  12  13
u  14  15  16  17  18  19  20
z  21  22  23  24  25  26  27
w  28  29  30  31  32  33  34

[5 rows x 7 columns]

In [7]: df[[1,3]] #No problem
Out[7]: 
    b   d
x   1   3
y   8  10
u  15  17
z  22  24
w  29  31

但是,当列名是整数时,我收到一个关键错误:

In [8]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], range(10, 17))

In [9]: df
Out[9]: 
   10  11  12  13  14  15  16
x   0   1   2   3   4   5   6
y   7   8   9  10  11  12  13
u  14  15  16  17  18  19  20
z  21  22  23  24  25  26  27
w  28  29  30  31  32  33  34

[5 rows x 7 columns]

In [10]: df[[1,3]]

结果:

KeyError: '[1 3] not in index'

我可以看到为什么大熊猫不允许这样做 - >避免在按列名和列号索引之间混淆。但是,有没有办法告诉大熊猫我想按列号索引?当然,一种解决方案是将列名转换为字符串,但我想知道是否有更好的解决方案。

3 个答案:

答案 0 :(得分:10)

这正是 iloc 的目的,请参阅here

In [37]: df
Out[37]: 
   10  11  12  13  14  15  16
x   0   1   2   3   4   5   6
y   7   8   9  10  11  12  13
u  14  15  16  17  18  19  20
z  21  22  23  24  25  26  27
w  28  29  30  31  32  33  34

In [38]: df.iloc[:,[1,3]]
Out[38]: 
   11  13
x   1   3
y   8  10
u  15  17
z  22  24
w  29  31

答案 1 :(得分:2)

这肯定是感觉像是一个错误的东西之一,但实际上是一个设计决定(我认为)。

一些解决方案:

将列的位置重命名为:

 df.columns = arange(0,len(df.columns))

另一种方法是从df.columns获取名称:

print df[ df.columns[[1,3]] ]
   11  13
x   1   3
y   8  10
u  15  17
z  22  24
w  29  31

我怀疑这是最吸引人的,因为它只需要添加一些代码而不更改任何列名。

答案 2 :(得分:1)

只需将标头从整数转换为字符串即可。在处理熊猫数据集时,几乎应始终将此作为最佳做法,以免出现意外情况

df.columns = df.columns.map(str)