3
���hY� � @ sx d dl Z d dlmZmZmZ d dlZd dljj Z
d dljjZ
d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d dlj j!Z d dl"m#Z# d d l$m%Z% d d
l&m'Z' d dl(m)Z)m*Z* d dl+m,Z, d d
l-m.Z.m/Z/m0Z0m1Z1 G dd� d�Z2d+dd�Z3d,dd�Z4d-dd�Z5dd� Z6d/dd�Z7d0dd�Z8d2dd�Z9d3d"d#�d$d%�Z:d4d&d'�Z;e<e<d(�d)d*�Z=dS )5� N)�List�Optional�Union)�IntIndex)�cache_readonly)�
maybe_promote)�ensure_platform_int�
is_bool_dtype�is_extension_array_dtype�
is_integer�is_integer_dtype�is_list_like�is_object_dtype�needs_i8_conversion)�notna)�SparseArray)�factorize_from_iterable)� DataFrame)�Index�
MultiIndex)�Series)�compress_group_index�decons_obs_group_ids�get_compressed_ids�get_group_indexc @ sz e Zd ZdZded�dd�Zedd� �Zed d
� �Ze j
e j
d�dd
�Zdd� Zdd� Z
ddd�Zdd� Zedd� �ZdS )�
_Unstackera
Helper class to unstack data / pivot with multi-level index
Parameters
----------
index : MultiIndex
level : int or str, default last level
Level to "unstack". Accepts a name for the level.
fill_value : scalar, optional
Default value to fill in missing values if subgroups do not have the
same set of labels. By default, missing values will be replaced with
the default fill value for that data type, NaN for float, NaT for
datetimelike, etc. For integer types, by default data will converted to
float and missing values will be set to NaN.
constructor : object
Pandas ``DataFrame`` or subclass used to create unstacked
response. If None, DataFrame will be used.
Examples
--------
>>> index = pd.MultiIndex.from_tuples([('one', 'a'), ('one', 'b'),
... ('two', 'a'), ('two', 'b')])
>>> s = pd.Series(np.arange(1, 5, dtype=np.int64), index=index)
>>> s
one a 1
b 2
two a 3
b 4
dtype: int64
>>> s.unstack(level=-1)
a b
one 1 2
two 3 4
>>> s.unstack(level=0)
one two
a 1 3
b 2 4
Returns
-------
unstacked : DataFrame
� N)�indexc C s� |d krt }|| _|j� | _| jj|�| _d| jj| j kr@dnd| _t| jj �| _
t| jj�| _| jj
| j�| _| j
j
| j�| _|j | j | _tjdd� | j
D ��}| jj}tj||tjd�}|dkr�|dkr�|dkr�td��| j� d S )Nr r c S s g | ]
}|j �qS � )�size)�.0Zindex_levelr r �=/tmp/pip-build-5_djhm0z/pandas/pandas/core/reshape/reshape.py�
<listcomp>o s z'_Unstacker.__init__.<locals>.<listcomp>)�dtypez6Unstacked DataFrame is too big, causing int32 overflow���)r �constructorZremove_unused_levelsr �_get_level_number�level�codes�lift�list�levels�new_index_levels�names�new_index_names�pop�removed_name�
removed_level�removed_level_full�np�maxr �multiplyZint32�
ValueError�_make_selectors)�selfr r' |