pandas 当列名为整数时,按列号为DataFrame建立索引

gcxthw6b  于 2022-11-20  发布在  其他
关注(0)|答案(4)|浏览(156)

我尝试只保留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'

我明白为什么Pandas不允许-〉避免混淆列名和列号索引。但是,有没有办法告诉Pandas我想用列号索引?当然,一个解决办法是将列名转换成字符串,但我想知道是否有更好的解决办法。

iqxoj9l9

iqxoj9l91#

这正是 iloc 的目的,请看这里

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
rlcwz9us

rlcwz9us2#

只需要将头从整数转换为字符串即可。在处理Pandas数据集时,这应该作为最佳实践,以避免意外

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

ruoxqz4g3#

这当然是那些感觉像bug但实际上是设计决策的事情之一(我认为)。
以下是一些解决方案:
以列的位置作为名称重命名列:

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

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

c9qzyr3d

c9qzyr3d4#

import pandas as pd
df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], range(10, 17))

#Let say you want to keep only columns 1,2 (these are locations not names)
needed_columns = [1,2]

df = df[df.columns[needed_columns]

print(df)

11  12
x   1   2
y   8   9
u   15  16
z   22  23
w   29  30

相关问题