Python Pandas – 使用级别名称返回删除多个级别的MultiIndex
在 Pandas 中,MultiIndex 可以帮助我们创建更复杂的数据结构。但是,在某些情况下,我们可能需要删除多个级别。本文将介绍如何使用级别名称返回删除多个级别的 MultiIndex。
什么是 MultiIndex?
MultiIndex 是 Pandas 中一种用于创建分层索引的数据结构,它允许在一个轴上拥有多个级别。例如,我们可以在一个 DataFrame 中创建一个具有城市和日期两个级别的 MultiIndex,如下所示:
import pandas as pd
df = pd.DataFrame(
{
"城市": ["北京", "上海", "广州", "北京", "上海", "广州"],
"日期": ["2021-01-01", "2021-01-01", "2021-01-01", "2021-01-02", "2021-01-02", "2021-01-02"],
"销售额": [100, 200, 150, 120, 250, 180],
}
)
df = df.set_index(['城市', '日期'])
print(df)
输出结果为:
销售额
城市 日期
北京 2021-01-01 100
上海 2021-01-01 200
广州 2021-01-01 150
北京 2021-01-02 120
上海 2021-01-02 250
广州 2021-01-02 180
可以看到,索引有两个级别:城市和日期。
返回删除多个级别的 MultiIndex
如果想要删除 MultiIndex 中的多个级别,我们可以使用 drop() 方法。但是,这个方法并不支持一次性删除多个级别。为了解决这个问题,我们可以使用以下函数来删除多个级别:
def drop_level_by_names(df: pd.DataFrame, names: list) -> pd.DataFrame:
"""
Given a multiindex DataFrame and a list of level names to remove,
returns a DataFrame with the desired levels removed.
"""
ix = df.index
for n in names:
ix = ix.droplevel(n)
return df.reindex(ix)
这个函数接受一个 DataFrame 和一个要删除级别名称的列表,然后返回一个不包含指定级别的新 DataFrame。例如,如果我们想要删除上面示例 DataFrame 中的城市和日期两个级别,可以这样做:
new_df = drop_level_by_names(df, ['城市', '日期'])
print(new_df)
输出结果为:
销售额
0 100
1 200
2 150
3 120
4 250
5 180
可以看到,新 DataFrame 中不包含城市和日期两个级别。
结论
在 Pandas 中,MultiIndex 是一种用于创建分层索引的数据结构,可以帮助我们创建更复杂的数据结构。如果想要删除 MultiIndex 中的多个级别,我们可以使用 drop() 方法。但是,这个方法并不支持一次性删除多个级别。为了解决这个问题,我们可以使用上面提到的 drop_level_by_names() 函数来删除多个级别。
极客笔记