Pandas 创建多索引数据帧时如何合并常用索引
我有一个如下所示的数据帧:Pandas 创建多索引数据帧时如何合并常用索引,pandas,dataframe,Pandas,Dataframe,我有一个如下所示的数据帧: Method Dataset foo bar 0 A1 B1 10 20 1 A1 B2 10 20 2 A1 B2 10 20 3 A2 B1 10 20 4 A3 B1 10 20 5 A1 B1 10 20 6 A2 B2 10 20 7 A3 B2 1
Method Dataset foo bar
0 A1 B1 10 20
1 A1 B2 10 20
2 A1 B2 10 20
3 A2 B1 10 20
4 A3 B1 10 20
5 A1 B1 10 20
6 A2 B2 10 20
7 A3 B2 10 20
我想使用方法
和数据集
列将其转换为多索引数据帧。所以我试着做:
df.set_index(["Method", "Dataset"], inplace=True)
df.sort_index(inplace=True)
其中:
Method Dataset
A1 B1 10 20
B1 10 20
B2 10 20
B2 10 20
A2 B1 10 20
B2 10 20
A3 B1 10 20
B2 10 20
这几乎就是我想要的,但我希望看到数据集
索引中的公共值也合并到一个值下,即类似于方法
索引:
foo bar
Method Dataset
A1 B1 10 20
10 20
B2 10 20
10 20
A2 B1 10 20
B2 10 20
A3 B1 10 20
B2 10 20
我怎样才能做到这一点
(这可能对如何使用数据帧没有太大影响,但我正在尝试使用对这些内容敏感的
to_latex()
方法)我建议您在将数据帧写入_latex之前,在最后完成此操作,否则您可能会遇到数据处理问题
我们将使最后一级中的重复项成为空字符串,并重建整个多索引
import pandas as pd
import numpy as np
df.index = pd.MultiIndex.from_arrays([
df.index.get_level_values('Method'),
np.where(df.index.duplicated(), '', df.index.get_level_values('Dataset'))
], names=['Method', 'Dataset'])
如果您想让它对任何级别(甚至只是一个简单的索引)更灵活,我们可以使用此函数,它将在最后一个级别中替换:
def white_out_index(idx):
"""idx : pd.MultiIndex or pd.Index"""
i0 = [idx.get_level_values(i) for i in range(idx.nlevels-1)]
i0.append(np.where(idx.duplicated(), '', idx.get_level_values(-1)))
return pd.MultiIndex.from_arrays(i0, names=idx.names)
df.index = white_out_index(df.index)
def white_out_index(idx):
"""idx : pd.MultiIndex or pd.Index"""
i0 = [idx.get_level_values(i) for i in range(idx.nlevels-1)]
i0.append(np.where(idx.duplicated(), '', idx.get_level_values(-1)))
return pd.MultiIndex.from_arrays(i0, names=idx.names)
df.index = white_out_index(df.index)