pandas之索引的变形stack和unstack

本文深入探讨了Pandas库中的unstack和stack函数,这两个函数用于数据透视和平展数据框。unstack将行索引转换为列索引,而stack则相反,将列索引转换为行索引。通过实例展示了它们如何工作,包括参数使用和处理唯一性的要求。此外,还展示了在数据不满足唯一性条件时可能出现的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unstack

unstack 函数的作用是把行索引转为列索引,例如下面这个简单的例子:

In [41]: df = pd.DataFrame(np.ones((4,2)),
   ....:                   index = pd.Index([('A', 'cat', 'big'),
   ....:                                     ('A', 'dog', 'small'),
   ....:                                     ('B', 'cat', 'big'),
   ....:                                     ('B', 'dog', 'small')]),
   ....:                   columns=['col_1', 'col_2'])
   ....: 

In [42]: df
Out[42]: 
             col_1  col_2
A cat big      1.0    1.0
  dog small    1.0    1.0
B cat big      1.0    1.0
  dog small    1.0    1.0

In [43]: df.unstack()
Out[43]: 
      col_1       col_2      
        big small   big small
A cat   1.0   NaN   1.0   NaN
  dog   NaN   1.0   NaN   1.0
B cat   1.0   NaN   1.0   NaN
  dog   NaN   1.0   NaN   1.0

unstack 的主要参数是移动的层号,默认转化最内层,移动到列索引的最内层,同时支持同时转化多个层:

In [44]: df.unstack(2)
Out[44]: 
      col_1       col_2      
        big small   big small
A cat   1.0   NaN   1.0   NaN
  dog   NaN   1.0   NaN   1.0
B cat   1.0   NaN   1.0   NaN
  dog   NaN   1.0   NaN   1.0

In [45]: df.unstack([0,2])
Out[45]: 
    col_1                  col_2                 
        A          B           A          B      
      big small  big small   big small  big small
cat   1.0   NaN  1.0   NaN   1.0   NaN  1.0   NaN
dog   NaN   1.0  NaN   1.0   NaN   1.0  NaN   1.0

类似于 pivot中的唯一性要求,在 unstack 中必须保证 被转为列索引的行索引层被保留的行索引层 构成的组合是唯一的,例如把前两个列索引改成相同的破坏唯一性,那么就会报错:

In [46]: my_index = df.index.to_list()

In [47]: my_index[1] = my_index[0]

In [48]: df.index = pd.Index(my_index)

In [49]: df
Out[49]: 
             col_1  col_2
A cat big      1.0    1.0
      big      1.0    1.0
B cat big      1.0    1.0
  dog small    1.0    1.0

In [50]: try:
   ....:    df.unstack()
   ....: except Exception as e:
   ....:    Err_Msg = e
   ....: 

In [51]: Err_Msg
Out[51]: ValueError('Index contains duplicate entries, cannot reshape')

stack

unstack 相反,stack 的作用就是把列索引的层压入行索引 ,其用法完全类似。

In [52]: df = pd.DataFrame(np.ones((4,2)),
   ....:                   index = pd.Index([('A', 'cat', 'big'),
   ....:                                     ('A', 'dog', 'small'),
   ....:                                     ('B', 'cat', 'big'),
   ....:                                     ('B', 'dog', 'small')]),
   ....:                   columns=['index_1', 'index_2']).T
   ....: 

In [53]: df
Out[53]: 
           A          B      
         cat   dog  cat   dog
         big small  big small
index_1  1.0   1.0  1.0   1.0
index_2  1.0   1.0  1.0   1.0

In [54]: df.stack()
Out[54]: 
                 A         B     
               cat  dog  cat  dog
index_1 big    1.0  NaN  1.0  NaN
        small  NaN  1.0  NaN  1.0
index_2 big    1.0  NaN  1.0  NaN
        small  NaN  1.0  NaN  1.0

In [55]: df.stack([1, 2])
Out[55]: 
                     A    B
index_1 cat big    1.0  1.0
        dog small  1.0  1.0
index_2 cat big    1.0  1.0
        dog small  1.0  1.0

<think>嗯,用户想了解Pandas里的stackunstack方法的用法区别。我先得回忆一下这两个函数的作用。记得stack是用来把列转换成行,也就是将宽格式数据变成长格式,而unstack则是相反,把行转换成列,让数据变宽。可能需要用例子来解释清楚。 首先,要确认用户的使用场景。用户可能在处理多层索引的数据,或者需要数据透视、重塑结构的时候用到这两个方法。比如,处理时间序列数据或者分组聚合后的结果。用户提供的引用里提到了多层索引数据透视,这stack/unstack的应用场景相关。 接下来,我需要解释stack的具体用法。通常,当DataFrame有列的多层索引时,stack会把某一层的列转成行,生成一个Series或DataFrame。例如,如果列有两层,stack之后,外层列会变成行索引的新层级。这时候数据会更“长”,适合进行分析或绘图。 然后是unstack,它则是把行索引的某一层转成列。比如,如果行有多层索引unstack可以把其中一层变成列,让数据变得更“宽”,便于展示或进一步处理。比如,将月份作为行索引unstack后变成列,每个月份的数据作为不同的列。 还要注意它们的参数,比如level,用来指定操作哪一层的索引。默认可能是最内层。另外,处理缺失值的情况,当unstack时如果某些组合不存在数据,会自动填充NaN,这时候可能需要处理缺失值。 用户提供的引用里提到了concatMultiIndex,可能用户对Pandas的其他重塑操作也有兴趣,但当前问题集中在stackunstack。需要确保回答覆盖基本用法、区别,以及实际例子。 另外,用户可能混淆这两个方法,所以需要明确对比它们的差异:stack是列转行,增加行索引层级;unstack是行转列,增加列索引层级。同时,结果的数据结构可能从DataFrame变为Series,特别是在多层索引的情况下。 最后,生成相关问题的时候,可以考虑数据重塑的其他方法,比如pivot、melt,或者多层索引的应用场景,以及如何处理操作后的缺失值。这些问题能帮助用户深入理解相关主题。</think>### Pandasstackunstack方法详解 #### 一、基本定义 1. **stack(堆叠)** 将DataFrame的列索引转换为行索引,生成具有多层索引的Series或DataFrame,公式表达为: $$ \text{宽表} \xrightarrow{\text{stack}} \text{长表} $$ 2. **unstack(解堆叠)** 将行索引的某一层级转换为列索引,公式表达为: $$ \text{长表} \xrightarrow{\text{unstack}} \text{宽表} $$ #### 二、使用示例 假设有以下多层索引DataFrame: ```python import pandas as pd arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]] index = pd.MultiIndex.from_arrays(arrays, names=('letters', 'numbers')) df = pd.DataFrame({'data1': [10, 20, 30, 40], 'data2': [50, 60, 70, 80]}, index=index) ``` 1. **stack操作** 将列标签转换为行索引: ```python stacked = df.stack() ``` 输出结果的行索引变为`(letters, numbers, column)`三层结构,数据从二维表变为一维序列。 2. **unstack操作** 将行索引层级展开为列: ```python unstacked = stacked.unstack(level='numbers') # 展开numbers层级 ``` 输出结果的列会包含`data1``data2`在不同`numbers`值下的组合。 #### 三、核心区别 | 特性 | stack | unstack | |--------------|--------------------------------|--------------------------------| | 数据维度变化 | 减少列维度,增加行维度(长数据) | 减少行维度,增加列维度(宽数据)| | 典型应用场景 | 数据规范化、时间序列分析 | 数据透视、交叉分析 | | 索引操作 | 列索引→行索引 | 行索引→列索引 | #### 四、注意事项 1. 缺失值处理:unstack可能产生NaN值,可配合`fill_value`参数处理 2. 层级选择:通过`level`参数指定操作层级(支持名称或位置编号) 3. 多层索引:与`pd.MultiIndex`结合使用时效果更显著[^3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值