是否可以在 pandas 数据框中有多个索引?

Posted

技术标签:

【中文标题】是否可以在 pandas 数据框中有多个索引?【英文标题】:Is it possible to have multiple indexes into a pandas dataframe? 【发布时间】:2020-12-30 02:24:23 【问题描述】:

单个 pandas DataFrame 是否可以同时拥有多个索引?

我所说的索引是指类似于 SQL 数据库或 MongoDB 必须大幅提高某些查询的性能的东西。

假设您有一个订单数据框,有时您希望通过其 ID 对订单进行索引,而有时您希望通过另一个键(例如仓库、客户 ID、时间等)对订单进行索引。

【问题讨论】:

是的,您可以使用 MultiIndex 并使用 IndexSlice 进行查询。或者您可以像df.query('ClientID=10') 或布尔索引一样查询:df[df['ClientID']==10] 【参考方案1】:

简短回答:是的。

请参考https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html

s = pd.Series([1, 2, 3, 4])
df.set_index([s, s**2])
      month  year  sale
1 1       1  2012    55
2 4       4  2014    40
3 9       7  2013    84
4 16     10  2014    31

多索引的另一个例子:

dct = 'id' : (0,0,1,1,2,2,3,3,4,4,5,5),
    'Store': ('A','A','A','A','A','A','B','B','B','C','C','C'),
       'code_num':('INC101','INC102','INC103','INC104','INC105','INC106','INC201','INC202','INC203','INC301','INC302','INC303'),
       'days':('4','18','9','15','3','6','10','5','3','1','8','5'),
       'products': ('remote','antenna','remote,antenna','TV','display','TV','display,touchpad','speaker','Cell','display','speaker','antenna')

df = pd.DataFrame(dct)
df.set_index(['id','Store','code_num'])

df :

【讨论】:

是否可以将第二个索引设为 MultiIndex? 您的问题是:单个 pandas DataFrame 是否可以同时拥有多个索引? 是的,但是如果我希望能够使用我在帖子中描述的两种不同方式进行索引,其中第一种方式需要一个只有一个项目(订单 ID)的键,而第二种方式需要一个复合键(仓库 + 客户 ID + 时间)),我需要有两个索引,其中第一个是常规索引,而第二个是 MultiIndex。现在有意义吗? 更新了示例 这两个例子都创建了 MultiIndex,但问题是关于拥有独立的索引

以上是关于是否可以在 pandas 数据框中有多个索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个索引更新多索引数据框中的记录

如果数值数据类型列 Pandas 数据框中的值为 str,则打印索引和值

Pandas 将多个数据帧与时间戳索引对齐

在具有非唯一索引列日期的 Dask 数据框中提取最新值

从具有复合(分层)索引的 Pandas 数据框中选择行

pandas:在多索引数据框中转换索引类型