设置pandas中现有DataFrame的多重索引

68 投票
2 回答
118422 浏览
提问于 2025-04-18 08:35

我有一个数据表(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'])

res1


注意,set_index()默认会覆盖旧的索引。如果你想保留旧的索引,可以通过append=参数把新的索引添加上去。

df = df.set_index(['Company', 'date'], append=True)

res2


新的索引不一定要来自于列。你可以传递一个与数据框长度相同的pandas系列或numpy数组给set_index()

new_idx = pd.Series(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
df = df.set_index([new_idx, 'date'])

res3


如果想设置一个全新的多重索引(MultiIndex),可以使用pd.MultiIndex对象。根据你用来构建索引的方式,有一些方便的方法,比如from_arrays()from_tuples()from_product()

例如,如果你想从lst1lst2的笛卡尔积创建一个多重索引,可以调用from_product()来实现。注意,多重索引的长度必须和数据框的长度一致,这样才能正常工作。

lst1 = ['a', 'b', 'c', 'd']
lst2 = [100, 200]
df.index = pd.MultiIndex.from_product([lst1, lst2])

res5

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)

撰写回答