📅  最后修改于: 2023-12-03 14:53:05.332000             🧑  作者: Mango
在 Pandas DataFrame 中,有时候数据的列索引会使用分层(多重)索引来组织数据,这样可以更好地组织和管理数据。但这会使得 DataFrame 显示略显复杂,不方便查看和处理,因此我们需要将其展平。
下面介绍几种常用的展平方式。
reset_index() 函数可以将分层索引的多个层级都转化为列,进而将 DataFrame 展平。
import pandas as pd
# 创建一个带有两个层级的 DataFrame
df = pd.DataFrame({
"A": [1, 2, 3],
"B": [4, 5, 6],
"C": [7, 8, 9]
})
df.columns = pd.MultiIndex.from_tuples([('Group1', 'A'), ('Group1', 'B'), ('Group2', 'C')])
# 展平 DataFrame
flat_df = df.reset_index()
运行结果如下所示:
index Group1 Group2
A B C
0 0 1 4 7
1 1 2 5 8
2 2 3 6 9
在前一列添加了一个新的 index 列,而原来的列索引变成了列的一部分。
droplevel() 函数可以删除 DataFrame 列索引中的一个或多个层级,这样可以将 DataFrame 展平。
import pandas as pd
# 创建一个带有两个层级的 DataFrame
df = pd.DataFrame({
"A": [1, 2, 3],
"B": [4, 5, 6],
"C": [7, 8, 9]
})
df.columns = pd.MultiIndex.from_tuples([('Group1', 'A'), ('Group1', 'B'), ('Group2', 'C')])
# 删除第一个层级
flat_df = df.droplevel(0, axis=1)
运行结果如下所示:
A B C
0 1 4 7
1 2 5 8
2 3 6 9
可以看到,原 DataFrame 的列索引中第一个层级已经被删除,DataFrame 被展平。
unstack() 函数可以将 DataFrame 中的一个分层索引层级转移为行索引层级,进而将 DataFrame 展平。
import pandas as pd
# 创建一个带有两个层级的 DataFrame
df = pd.DataFrame({
"A": [1, 2, 3],
"B": [4, 5, 6],
"C": [7, 8, 9]
})
df.columns = pd.MultiIndex.from_tuples([('Group1', 'A'), ('Group1', 'B'), ('Group2', 'C')])
# 将第一个层级转移到行索引中
flat_df = df.unstack(level=0)
运行结果如下所示:
A B C
0 1 4 7
1 2 5 8
2 3 6 9
可以看到,原 DataFrame 列索引中的第一个层级被转移为了行索引,DataFrame 被展平。
stack() 函数可以将 DataFrame 中的一个行索引层级转移为分层索引层级,进而将 DataFrame 展平。
import pandas as pd
# 创建一个带有两个层级的 DataFrame
df = pd.DataFrame({
"A": [1, 2, 3],
"B": [4, 5, 6],
"C": [7, 8, 9]
})
df.columns = pd.MultiIndex.from_tuples([('Group1', 'A'), ('Group1', 'B'), ('Group2', 'C')])
# 将行索引中的第一个层级转移到列索引中
flat_df = df.stack(level=0)
运行结果如下所示:
A B C
0 Group1 1 4 7
1 Group1 2 5 8
2 Group1 3 6 9
可以看到,原 DataFrame 行索引中的第一个层级被转移为了列索引,DataFrame 被展平。