在Pandas中设置现有DataFrame的MultiIndex

gg58donl  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(171)

我有一个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

我想传递公司和日期来设置此DataFrame的MultiIndex。当前它有一个默认索引。我使用

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

但是当我打印的时候,它打印的是None,这不是正确的方法吗?我还想移动列company和date的位置,使company成为层次结构中的第一个索引,date成为第二个索引,对此有什么想法吗?

oalqel3c

oalqel3c1#

当你传入inplace时,会对原始变量进行更改并返回None,而函数不会返回修改后的 Dataframe ,它会返回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)
hjzp0vay

hjzp0vay2#

set_index()的结果是一个副本,因此您可以将其分配回df(而不是使用inplace=参数)。

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

注意set_index()在默认情况下是如何覆盖旧索引的,您可以通过append=参数追加新索引来保留旧索引。

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

新的索引不需要来自列,你可以传递一个panda Series或者一个与 Dataframe 长度相同的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()等方便的方法。
例如,如果要从lst1lst2的笛卡尔积创建多索引,可以通过调用from_product()来完成。请注意,多索引的长度必须与 Dataframe 的长度匹配,才能使此操作正常工作。

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

相关问题