设置pandas中现有DataFrame的多重索引
我有一个数据表(DataFrame),它的样子是这样的:
Emp1 Empl2 date Company
0 0 0 2012-05-01 apple
1 0 1 2012-05-29 apple
2 0 1 2013-05-02 apple
3 0 1 2013-11-22 apple
18 1 0 2011-09-09 google
19 1 0 2012-02-02 google
20 1 0 2012-11-26 google
21 1 0 2013-05-11 google
我想用公司和日期来设置这个数据表的多重索引(MultiIndex)。现在它只有一个默认的索引。我正在使用:
df.set_index(['Company', 'date'], inplace=True)
但是当我打印出来的时候,显示的是None
。这样做是不是不对?另外,我还想把公司和日期的顺序调换一下,让公司成为第一个索引,日期成为第二个索引。有没有什么好主意?
2 个回答
5
set_index()
的结果是一个副本,所以你可以把它重新赋值给df
(而不是使用inplace=
参数)。
df = df.set_index(['Company', 'date'])
注意,set_index()
默认会覆盖旧的索引。如果你想保留旧的索引,可以通过append=
参数把新的索引添加上去。
df = df.set_index(['Company', 'date'], append=True)
新的索引不一定要来自于列。你可以传递一个与数据框长度相同的pandas系列或numpy数组给set_index()
。
new_idx = pd.Series(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
df = df.set_index([new_idx, 'date'])
如果想设置一个全新的多重索引(MultiIndex),可以使用pd.MultiIndex
对象。根据你用来构建索引的方式,有一些方便的方法,比如from_arrays()
、from_tuples()
和from_product()
。
例如,如果你想从lst1
和lst2
的笛卡尔积创建一个多重索引,可以调用from_product()
来实现。注意,多重索引的长度必须和数据框的长度一致,这样才能正常工作。
lst1 = ['a', 'b', 'c', 'd']
lst2 = [100, 200]
df.index = pd.MultiIndex.from_product([lst1, lst2])
97
当你在函数中使用 inplace 参数时,它会直接在原来的变量上进行修改,并且返回的结果是 None,也就是说这个函数不会返回修改后的数据框,而是返回 None。
is_none = df.set_index(['Company', 'date'], inplace=True)
df # the dataframe you want
is_none # has the value None
所以当你有这样一行代码:
df = df.set_index(['Company', 'date'], inplace=True)
它首先会修改 df
... 但接着会把 df
设置为 None!
也就是说,你应该直接使用这一行:
df.set_index(['Company', 'date'], inplace=True)