【问题标题】:How to reverse the `unstack` method of a `DataFrame` in `pandas` back to original object?如何将`pandas`中`DataFrame`的`unstack`方法反转回原始对象?
【发布时间】:2019-01-20 18:00:05
【问题描述】:

我想将一个对称相似矩阵 (pd.DataFrame) 转换为带有pd.MultiIndex 的未堆叠pd.Series,然后再转换回pd.DataFrame

这是获取对称pd.DataFrame 的代码以及我尝试反转操作的代码。

我应该使用pivot 吗?我想以另一个名为df_sqr_revertpd.DataFrame 结尾,它与原始df_sqr 相同。

有人知道如何扭转这个操作吗?

data = {'sepal_length': {'sepal_length': 1.0, 'sepal_width': 0.44531537502467533, 'petal_length': 0.935877078652436, 'petal_width': 0.9089768166845817}, 'sepal_width': {'sepal_length': 0.44531537502467533, 'sepal_width': 1.0, 'petal_length': 0.2897419517994226, 'petal_width': 0.32172795519309727}, 'petal_length': {'sepal_length': 0.935877078652436, 'sepal_width': 0.2897419517994226, 'petal_length': 1.0, 'petal_width': 0.9813785485254833}, 'petal_width': {'sepal_length': 0.9089768166845817, 'sepal_width': 0.32172795519309727, 'petal_length': 0.9813785485254833, 'petal_width': 1.0}}

df_sqr = pd.DataFrame(data)
#               petal_length  petal_width  sepal_length  sepal_width
# petal_length      1.000000     0.981379      0.935877     0.289742
# petal_width       0.981379     1.000000      0.908977     0.321728
# sepal_length      0.935877     0.908977      1.000000     0.445315
# sepal_width       0.289742     0.321728      0.445315     1.000000
Se_vertical = df_sqr.unstack()
# petal_length  petal_length    1.000000
#               petal_width     0.981379
#               sepal_length    0.935877
#               sepal_width     0.289742
# petal_width   petal_length    0.981379
#               petal_width     1.000000
#               sepal_length    0.908977
#               sepal_width     0.321728
# sepal_length  petal_length    0.935877
#               petal_width     0.908977
#               sepal_length    1.000000
#               sepal_width     0.445315
# sepal_width   petal_length    0.289742
#               petal_width     0.321728
#               sepal_length    0.445315
#               sepal_width     1.000000
# dtype: float64

# df_sqr_revert = Se_vertical.stack()
# AttributeError: 'Series' object has no attribute 'stack'

【问题讨论】:

    标签: python pandas dataframe stack pivot-table


    【解决方案1】:

    自相矛盾的是,您在这里需要的是第二次 unstack 调用:

    In [14]: df
    Out[14]: 
                  sepal_length  sepal_width  petal_length  petal_width
    petal_length      0.935877     0.289742      1.000000     0.981379
    petal_width       0.908977     0.321728      0.981379     1.000000
    sepal_length      1.000000     0.445315      0.935877     0.908977
    sepal_width       0.445315     1.000000      0.289742     0.321728
    
    
    In [13]: df_sqr.unstack().unstack()
    Out[13]: 
                  petal_length  petal_width  sepal_length  sepal_width
    sepal_length      0.935877     0.908977      1.000000     0.445315
    sepal_width       0.289742     0.321728      0.445315     1.000000
    petal_length      1.000000     0.981379      0.935877     0.289742
    petal_width       0.981379     1.000000      0.908977     0.321728
    

    documentation 提到在系列等于枢轴的情况下取消堆叠,就像您在问题中怀疑的那样。


    奖金

    只是因为我很好奇,当我们为列和索引标签添加前缀时,stack 和 unstack 之间的区别会变得更加明显:

    In [17]: df.columns  = [f'columns_{i}' for i in df.columns]
    
    In [18]: df.index  = [f'index_{i}' for i in df.index]
    

    .stack() 将 row-index 放在多索引的最左边:

    In [20]: df.stack()
    Out[20]: 
    index_petal_length  columns_sepal_length    0.935877
                        columns_sepal_width     0.289742
                        columns_petal_length    1.000000
                        columns_petal_width     0.981379
    index_petal_width   columns_sepal_length    0.908977
                        columns_sepal_width     0.321728
                        columns_petal_length    0.981379
                        columns_petal_width     1.000000
    index_sepal_length  columns_sepal_length    1.000000
                        columns_sepal_width     0.445315
                        columns_petal_length    0.935877
                        columns_petal_width     0.908977
    index_sepal_width   columns_sepal_length    0.445315
                        columns_sepal_width     1.000000
                        columns_petal_length    0.289742
                        columns_petal_width     0.321728
    dtype: float64
    

    .unstack()将列索引作为多索引的最左一级:

    In [21]: df.unstack()
    Out[21]: 
    columns_sepal_length  index_petal_length    0.935877
                          index_petal_width     0.908977
                          index_sepal_length    1.000000
                          index_sepal_width     0.445315
    columns_sepal_width   index_petal_length    0.289742
                          index_petal_width     0.321728
                          index_sepal_length    0.445315
                          index_sepal_width     1.000000
    columns_petal_length  index_petal_length    1.000000
                          index_petal_width     0.981379
                          index_sepal_length    0.935877
                          index_sepal_width     0.289742
    columns_petal_width   index_petal_length    0.981379
                          index_petal_width     1.000000
                          index_sepal_length    0.908977
                          index_sepal_width     0.321728
    dtype: float64
    

    【讨论】:

    • 哈哈,很高兴它有帮助!
    • 出于好奇添加了更多信息,因为老实说,我只是通过反复试验才发现这一点 - TIL。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2020-09-09
    • 2014-10-05
    • 2022-07-28
    • 1970-01-01
    • 2015-09-15
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多