在pandas中,如何使用列索引set_index而不是引用列名?

时间:2016-06-27 23:52:36

标签: pandas

例如:

我们有一个Pandas dataFrame foo,有2列[' A',' B']。

我想做的功能就像    foo.set_index([0,1])  代替    foo.set_index(['A', 'B'])

也尝试了foo.set_index([[0,.1]])但是出现了这个错误:

长度不匹配:预期轴有9个元素,新值有2个元素

2 个答案:

答案 0 :(得分:5)

如果列索引唯一,您可以使用:

df.set_index(list(df.columns[cols]))

其中cols是序数索引列表。

例如,

In [77]: np.random.seed(2016)

In [79]: df = pd.DataFrame(np.random.randint(10, size=(5,4)), columns=list('ABCD'))

In [80]: df
Out[80]: 
   A  B  C  D
0  3  7  2  3
1  8  4  8  7
2  9  2  6  3
3  4  1  9  1
4  2  2  8  9

In [81]: df.set_index(list(df.columns[[0,2]]))
Out[81]: 
     B  D
A C      
3 2  7  3
8 8  4  7
9 6  2  3
4 9  1  1
2 8  2  9

如果DataFrame的列索引不唯一,则按标签设置索引 是不可能的,顺序更复杂:

import numpy as np
import pandas as pd
np.random.seed(2016)

def set_ordinal_index(df, cols):
    columns, df.columns = df.columns, np.arange(len(df.columns))
    mask = df.columns.isin(cols)
    df = df.set_index(cols)
    df.columns = columns[~mask]
    df.index.names = columns[mask]
    return df

df = pd.DataFrame(np.random.randint(10, size=(5,4)), columns=list('AAAA'))
print(set_ordinal_index(df, [0,2]))

产量

     A  A
A A      
3 2  7  3
8 8  4  7
9 6  2  3
4 9  1  1
2 8  2  9

答案 1 :(得分:0)

这对我有用,其他答案没有。

# single column
df.set_index(df.columns[1])
# multi column
df.set_index(df.columns[[1, 0]].tolist())