多列作为 MultiIndex 数据框中每个级别的索引
Multiple columns as the index for each level in a MultiIndex dataframe
我无法描述我的数据结构方式,希望这张图片能有所帮助。
如您所见,我有 3 列:名称、公司编号和分解类别,它们一起作为每一行的唯一标识符。有两个超级 header、"English/Language Arts Scores" 和 "Mathematics Scores." 我想为每个 header 创建两个单独的数据帧。这是我到目前为止所管理的:
df1 = pd.read_excel(file, header=None)
vals = df1.values
mux = pd.MultiIndex.from_arrays(df1.ffill(1).values[:2, 1:], names=[None, 'Name'])
df = pd.DataFrame(df1.values[2:, 1:], df1.values[2:, 0], mux)
这会生成一个具有两个级别的数据框:df['English/Language Arts Scores']
和 df['Mathematics Scores']
,其中包含 header 和 "Name" 下的列作为索引。我希望这些数据框包括:名称、Copr # 和分解类别作为列或索引。
执行此操作的最佳方法是什么?
编辑
这是我的数据的一个可复制和粘贴的片段:
English Math
A B C X Y X Y
ADAMS CENTRAL 0015 All Students 83 590 83 579
ADAMS CENTRAL 0015 General 1 0 *** 0 ***
ADAMS CENTRAL 0015 Total Gene 71 590 71 579
ADAMS West 0016 All Students 93 440 83 765
ADAMS West 0016 General 1 1 33 0 660
ADAMS West 0016 Total Gene 31 *** 46 572
我想要的输出应该是这样的:
In [1]: df['English']
Out[1]:
A B C X Y
ADAMS CENTRAL 0015 All Students 83 590
ADAMS CENTRAL 0015 General 1 0 ***
ADAMS CENTRAL 0015 Total Gene 71 590
ADAMS West 0016 All Students 93 440
ADAMS West 0016 General 1 1 33
ADAMS West 0016 Total Gene 31 ***
In [2]: df['Math']
Out[2]:
A B C X Y
ADAMS CENTRAL 0015 All Students 83 579
ADAMS CENTRAL 0015 General 1 0 ***
ADAMS CENTRAL 0015 Total Gene 71 579
ADAMS West 0016 All Students 83 765
ADAMS West 0016 General 1 0 660
ADAMS West 0016 Total Gene 46 572
我们可以使用 read_excel
,读取文件,然后使用 .loc
,将您需要的 level0 列切片
df = pd.read_excel('yourexcel.xlsx',
header=[0,1],
index_col=[0,1,2],
sheetname="Sheet1")
df.loc[:,'English']
Out[837]:
C X Y
ADAMS CENTRAL 15 All Students 83 590
General 1 0 ***
Total Gene 71 590
ADAMS West 16 All Students 93 440
General 1 1 33
Total Gene 31 ***
为了使它更整洁添加 rename_axis
df.loc[:,'English'].rename_axis(None,1)
Out[840]:
X Y
ADAMS CENTRAL 15 All Students 83 590
General 1 0 ***
Total Gene 71 590
ADAMS West 16 All Students 93 440
General 1 1 33
Total Gene 31 ***
我们基于您的方法
vals = df.iloc[3:,:].values
df1 = pd.DataFrame(df.values[3:, 3:], df.values[3:, 0:3])
mux = pd.MultiIndex.from_arrays(df.ffill().ffill(1).values[1:3, 3:])
df1.columns=mux
df1.index = pd.MultiIndex.from_tuples(df1.index)
我无法描述我的数据结构方式,希望这张图片能有所帮助。
如您所见,我有 3 列:名称、公司编号和分解类别,它们一起作为每一行的唯一标识符。有两个超级 header、"English/Language Arts Scores" 和 "Mathematics Scores." 我想为每个 header 创建两个单独的数据帧。这是我到目前为止所管理的:
df1 = pd.read_excel(file, header=None)
vals = df1.values
mux = pd.MultiIndex.from_arrays(df1.ffill(1).values[:2, 1:], names=[None, 'Name'])
df = pd.DataFrame(df1.values[2:, 1:], df1.values[2:, 0], mux)
这会生成一个具有两个级别的数据框:df['English/Language Arts Scores']
和 df['Mathematics Scores']
,其中包含 header 和 "Name" 下的列作为索引。我希望这些数据框包括:名称、Copr # 和分解类别作为列或索引。
执行此操作的最佳方法是什么?
编辑
这是我的数据的一个可复制和粘贴的片段:
English Math
A B C X Y X Y
ADAMS CENTRAL 0015 All Students 83 590 83 579
ADAMS CENTRAL 0015 General 1 0 *** 0 ***
ADAMS CENTRAL 0015 Total Gene 71 590 71 579
ADAMS West 0016 All Students 93 440 83 765
ADAMS West 0016 General 1 1 33 0 660
ADAMS West 0016 Total Gene 31 *** 46 572
我想要的输出应该是这样的:
In [1]: df['English']
Out[1]:
A B C X Y
ADAMS CENTRAL 0015 All Students 83 590
ADAMS CENTRAL 0015 General 1 0 ***
ADAMS CENTRAL 0015 Total Gene 71 590
ADAMS West 0016 All Students 93 440
ADAMS West 0016 General 1 1 33
ADAMS West 0016 Total Gene 31 ***
In [2]: df['Math']
Out[2]:
A B C X Y
ADAMS CENTRAL 0015 All Students 83 579
ADAMS CENTRAL 0015 General 1 0 ***
ADAMS CENTRAL 0015 Total Gene 71 579
ADAMS West 0016 All Students 83 765
ADAMS West 0016 General 1 0 660
ADAMS West 0016 Total Gene 46 572
我们可以使用 read_excel
,读取文件,然后使用 .loc
,将您需要的 level0 列切片
df = pd.read_excel('yourexcel.xlsx',
header=[0,1],
index_col=[0,1,2],
sheetname="Sheet1")
df.loc[:,'English']
Out[837]:
C X Y
ADAMS CENTRAL 15 All Students 83 590
General 1 0 ***
Total Gene 71 590
ADAMS West 16 All Students 93 440
General 1 1 33
Total Gene 31 ***
为了使它更整洁添加 rename_axis
df.loc[:,'English'].rename_axis(None,1)
Out[840]:
X Y
ADAMS CENTRAL 15 All Students 83 590
General 1 0 ***
Total Gene 71 590
ADAMS West 16 All Students 93 440
General 1 1 33
Total Gene 31 ***
我们基于您的方法
vals = df.iloc[3:,:].values
df1 = pd.DataFrame(df.values[3:, 3:], df.values[3:, 0:3])
mux = pd.MultiIndex.from_arrays(df.ffill().ffill(1).values[1:3, 3:])
df1.columns=mux
df1.index = pd.MultiIndex.from_tuples(df1.index)