Pandas将数据框的行转换为对角线数据框。

3

我有一个数据框,我想将每一行转换为对角线数据框,并将所有结果绑定到一个大的数据框中。 输入:

            a   b   c
2021-11-06  1   2   3
2021-11-07  4   5   6

期望输出:


                   a    b   c
Date                
2021-11-06     a    1   0   0
               b    0   2   0
               c    0   0   3
2021-11-07     a    4   0   0
               b    0   5   0
               c    0   0   6

我尝试对原始数据框的每一行使用apply函数。

data = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a', 'b', 'c'], index=pd.date_range('2021-11-06', '2021-11-07')) 

def convert_dataframe(ser):
    df_ser = pd.DataFrame(0.0, index=ser.index, columns=ser.index)
    np.fill_diagonal(df_ser.values, ser)
    return df_ser

data.apply(lambda x: convert_dataframe(x), axis=1)

然而,输出的不是我期望的多级索引数据框架。相反,输出是一个单索引数据框架,其中每一行都是对返回的对角线数据帧的引用。
非常感谢您的任何帮助。提前致谢。
1个回答

2

使用MultiIndex.droplevel方法可以删除多级索引的第一层,然后在DataFrame.stack函数之后调用函数,在GroupBy.apply中应用此技术:

def convert_dataframe(ser):
    ser = ser.droplevel(0)
    df_ser = pd.DataFrame(0, index=ser.index, columns=ser.index)
    np.fill_diagonal(df_ser.values, ser)
    
    return df_ser



data = data.stack().groupby(level=0).apply(convert_dataframe)
print (data)
              a  b  c
2021-11-06 a  1  0  0
           b  0  2  0
           c  0  0  3
2021-11-07 a  4  0  0
           b  0  5  0
           c  0  0  6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接