Python 按行对多索引列中的值重新排序

Python 按行对多索引列中的值重新排序,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下多索引表: A. B C D 图1 图2 图1 图2 图1 图2 图1 图2 x Y x Y x Y x Y x Y x Y x Y x Y 2.2 5.1 3.4 1.8 1.5 6.7 8.1 7.5 6.1 2.1 9.3 7.1 8.2 1.1 1.4 2.5 7.9 3.2 1.1 5.3 9.3 3.1 0.9 3.2 4.1 5.1 7.7 4.3 8.1 0.4 2.4 4.1 尝试使用unstack和groupby:我现在能想到的唯一解决方案 df1 = df.unst

我有以下多索引表:

A. B C D 图1 图2 图1 图2 图1 图2 图1 图2 x Y x Y x Y x Y x Y x Y x Y x Y 2.2 5.1 3.4 1.8 1.5 6.7 8.1 7.5 6.1 2.1 9.3 7.1 8.2 1.1 1.4 2.5 7.9 3.2 1.1 5.3 9.3 3.1 0.9 3.2 4.1 5.1 7.7 4.3 8.1 0.4 2.4 4.1 尝试使用unstack和groupby:我现在能想到的唯一解决方案

df1 = df.unstack().unstack()
for col in df1.columns:
    a = []
    for i,g in df1[col].groupby(level=0):
        a.append((i,g.iloc[0]))
    get_sortedli = sorted(a, key=lambda x: x[1])
    order_col = [f1 for f1,f2 in get_sortedli]
    val = (df.iloc[col].reindex(order_col, axis=1, level=0))
    df.iloc[col] = val
df:

我把这想象成一个4块排列的a,B,C,D问题。排列后,获取值并将其分配给实际数据帧

df1:

尝试使用unstack和groupby:我现在能想到的唯一解决方案

df1 = df.unstack().unstack()
for col in df1.columns:
    a = []
    for i,g in df1[col].groupby(level=0):
        a.append((i,g.iloc[0]))
    get_sortedli = sorted(a, key=lambda x: x[1])
    order_col = [f1 for f1,f2 in get_sortedli]
    val = (df.iloc[col].reindex(order_col, axis=1, level=0))
    df.iloc[col] = val
df:

我把这想象成一个4块排列的a,B,C,D问题。排列后,获取值并将其分配给实际数据帧

df1:


这里有一个选项,主要涉及数据的形状、排序,然后使用重新成形的值和原始df列以及多索引来创建最终的数据帧:

df2=df.T.unstacklevel=0.T.reset\u indexlevel=0,col\u fill='row' df2=df2。排序值['level\u 0','row','t\u 1','x'],忽略索引=True values=df2。删除“级别0”,“行”,轴=1.values.REPLACE2,-1 df3=pd.DataFramedata=value,columns=df.columns使用原始df的列 输出:

                    A                   B                   C                   D
        t_1       t_2       t_1       t_2       t_1       t_2       t_1       t_2
     x    y    x    y    x    y    x    y    x    y    x    y    x    y    x    y
0  1.5  6.7  8.1  7.5  2.2  5.1  3.4  1.8  6.1  2.1  9.3  7.1  8.2  1.1  1.4  2.5
1  4.1  5.1  7.7  4.3  7.9  3.2  1.1  5.3  8.1  0.4  2.4  4.1  9.3  3.1  0.9  3.2
以可读性更强但不准确的表格格式:

A. B C D 图1 图2 图1 图2 图1 图2 图1 图2 x Y x Y x Y x Y x Y x Y x Y x Y 1.5 6.7 8.1 7.5 2.2 5.1 3.4 1.8 6.1 2.1 9.3 7.1 8.2 1.1 1.4 2.5 4.1 5.1 7.7 4.3 7.9 3.2 1.1 5.3 8.1 0.4 2.4 4.1 9.3 3.1 0.9 3.2
这里有一个选项,主要涉及数据的形状、排序,然后使用重新成形的值和原始df列以及多索引来创建最终的数据帧:

df2=df.T.unstacklevel=0.T.reset\u indexlevel=0,col\u fill='row' df2=df2。排序值['level\u 0','row','t\u 1','x'],忽略索引=True values=df2。删除“级别0”,“行”,轴=1.values.REPLACE2,-1 df3=pd.DataFramedata=value,columns=df.columns使用原始df的列 输出:

                    A                   B                   C                   D
        t_1       t_2       t_1       t_2       t_1       t_2       t_1       t_2
     x    y    x    y    x    y    x    y    x    y    x    y    x    y    x    y
0  1.5  6.7  8.1  7.5  2.2  5.1  3.4  1.8  6.1  2.1  9.3  7.1  8.2  1.1  1.4  2.5
1  4.1  5.1  7.7  4.3  7.9  3.2  1.1  5.3  8.1  0.4  2.4  4.1  9.3  3.1  0.9  3.2
以可读性更强但不准确的表格格式:

A. B C D 图1 图2 图1 图2 图1 图2 图1 图2 x Y x Y x Y x Y x Y x Y x Y x Y 1.5 6.7 8.1 7.5 2.2 5.1 3.4 1.8 6.1 2.1 9.3 7.1 8.2 1.1 1.4 2.5 4.1 5.1 7.7 4.3 7.9 3.2 1.1 5.3 8.1 0.4 2.4 4.1 9.3 3.1 0.9 3.2
我没有回答这个问题。请多解释一下。你们是怎么得到那个结果表的。看来所有的x t_1都是按asc顺序排列的。“和y t_1是按顺序排列的。@Pygirl我已经补充了一些解释。只有xt_1用于排序,yt_1、xt_2和yt_2的值不相关,只是被xt_1排序“携带”。我没有回答这个问题。请多解释一下。你们是怎么得到那个结果表的。看来所有的x t_1都是按asc顺序排列的。“和y t_1是按顺序排列的。@Pygirl我已经补充了一些解释。只有xt_1用于排序,yt_1、xt_2和yt_2的值不相关,只是被xt_1排序“携带”。我很难找到按A、B、C、D块行元素排序的正确语法+1.看起来不错,我建议你使用这个很棒的工具来展示桌子:@Pygirl谢谢。我通常在需要时使用df.to_标记,但这根本不能很好地处理多索引列。链接的工具越来越近,但仍需要手动调整标题、删除重复的标题标签等,这并不理想。这与OP的表格中的问题相同。嗯,如果这有助于可读性的话,我可以加上它。我很难找到按A、B、C、D块行元素排序的正确语法+1.看起来不错,我建议你使用这个很棒的工具来展示桌子:@Pygirl谢谢。我通常在需要时使用df.to_标记,但这根本不能很好地处理多索引列。链接的工具越来越近,但仍需要手动调整标题、删除重复的标题标签等,这并不理想。这与OP的表格中的问题相同。嗯,如果这有助于可读性的话,我可以添加它。@Benjamin wrt您对添加val.index=df1[col].index的编辑-如您所见,这不是必需的,没有那一行的结果是一样的。val的索引已经是那样了。@Benjamin对添加val.index=df1[col].index的编辑进行了修改-正如您所见,这不是必需的,没有那一行的结果是一样的。瓦尔的索引已经是那样了。