例如:
我们有一个Pandas dataFrame foo,有2列[' A',' B']。
我想做的功能就像
foo.set_index([0,1])
代替
foo.set_index(['A', 'B'])
也尝试了foo.set_index([[0,.1]])
但是出现了这个错误:
长度不匹配:预期轴有9个元素,新值有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())