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