在熊猫中,如何使用列索引而不是引用列名来设置set_index?

Jin*_*Yun 5 pandas

例如:

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

我想做类似的功能 foo.set_index([0,1]) 而不是 foo.set_index(['A', 'B'])

也尝试过foo.set_index([[0,.1]]),但出现此错误:

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

unu*_*tbu 7

如果列索引是唯一的,则可以使用:

df.set_index(list(df.columns[cols]))
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

如果DataFrame的列索引不是unique,则不可能通过label设置索引,而通过ordinals 设置索引则更为复杂:

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]))
Run Code Online (Sandbox Code Playgroud)

产量

     A  A
A A      
3 2  7  3
8 8  4  7
9 6  2  3
4 9  1  1
2 8  2  9
Run Code Online (Sandbox Code Playgroud)