5
5
6
6
import numpy as np
7
7
8
+ import six
9
+
8
10
from pandas .core .series import Series
9
11
from pandas .core .frame import DataFrame
10
12
11
13
from pandas .core .categorical import Categorical
12
14
from pandas .core .common import (notnull , _ensure_platform_int , _maybe_promote ,
13
- _maybe_upcast , isnull )
15
+ isnull )
14
16
from pandas .core .groupby import (get_group_index , _compress_group_index ,
15
17
decons_group_index )
16
18
import pandas .core .common as com
17
19
import pandas .algos as algos
18
- from pandas import lib
19
20
20
- from pandas .core .index import MultiIndex , Index
21
+ from pandas .core .index import MultiIndex
21
22
22
23
23
24
class ReshapeError (Exception ):
@@ -35,21 +36,26 @@ class _Unstacker(object):
35
36
36
37
Examples
37
38
--------
39
+ >>> import pandas as pd
40
+ >>> index = pd.MultiIndex.from_tuples([('one', 'a'), ('one', 'b'),
41
+ ... ('two', 'a'), ('two', 'b')])
42
+ >>> s = pd.Series(np.arange(1.0, 5.0), index=index)
38
43
>>> s
39
- one a 1.
40
- one b 2.
41
- two a 3.
42
- two b 4.
44
+ one a 1
45
+ b 2
46
+ two a 3
47
+ b 4
48
+ dtype: float64
43
49
44
50
>>> s.unstack(level=-1)
45
51
a b
46
- one 1. 2.
47
- two 3. 4.
52
+ one 1 2
53
+ two 3 4
48
54
49
55
>>> s.unstack(level=0)
50
56
one two
51
- a 1. 2.
52
- b 3. 4.
57
+ a 1 2
58
+ b 3 4
53
59
54
60
Returns
55
61
-------
@@ -159,7 +165,7 @@ def get_result(self):
159
165
values [j ] = orig_values [i ]
160
166
else :
161
167
index = index .take (self .unique_groups )
162
-
168
+
163
169
return DataFrame (values , index = index , columns = columns )
164
170
165
171
def get_new_values (self ):
@@ -617,9 +623,10 @@ def melt(frame, id_vars=None, value_vars=None,
617
623
618
624
Examples
619
625
--------
626
+ >>> import pandas as pd
620
627
>>> df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
621
- 'B': {0: 1, 1: 3, 2: 5},
622
- 'C': {0: 2, 1: 4, 2: 6}})
628
+ ... 'B': {0: 1, 1: 3, 2: 5},
629
+ ... 'C': {0: 2, 1: 4, 2: 6}})
623
630
624
631
>>> df
625
632
A B C
@@ -632,7 +639,7 @@ def melt(frame, id_vars=None, value_vars=None,
632
639
0 a B 1
633
640
1 b B 3
634
641
2 c B 5
635
-
642
+
636
643
>>> melt(df, id_vars=['A'], value_vars=['B'],
637
644
... var_name='myVarname', value_name='myValname')
638
645
A myVarname myValname
@@ -679,9 +686,13 @@ def melt(frame, id_vars=None, value_vars=None,
679
686
if len (frame .columns .names ) == len (set (frame .columns .names )):
680
687
var_name = frame .columns .names
681
688
else :
682
- var_name = ['variable_%s' % i for i in range (len (frame .columns .names ))]
689
+ var_name = ['variable_%s' % i for i in
690
+ xrange (len (frame .columns .names ))]
683
691
else :
684
- var_name = frame .columns .name if frame .columns .name is not None else 'variable'
692
+ var_name = [frame .columns .name if frame .columns .name is not None
693
+ else 'variable' ]
694
+ if isinstance (var_name , six .string_types ):
695
+ var_name = [var_name ]
685
696
686
697
N , K = frame .shape
687
698
K -= len (id_vars )
@@ -690,17 +701,12 @@ def melt(frame, id_vars=None, value_vars=None,
690
701
for col in id_vars :
691
702
mdata [col ] = np .tile (frame .pop (col ).values , K )
692
703
693
- if isinstance (var_name , list ):
694
- mcolumns = id_vars + var_name + [value_name ]
695
- else :
696
- mcolumns = id_vars + [var_name , value_name ]
704
+ mcolumns = id_vars + var_name + [value_name ]
697
705
698
706
mdata [value_name ] = frame .values .ravel ('F' )
699
- if isinstance (frame .columns , MultiIndex ):
700
- for i , col in enumerate (var_name ):
701
- mdata [col ] = np .asarray (frame .columns .get_level_values (i )).repeat (N )
702
- else : # assume isinstance(frame.columns, Index):
703
- mdata [var_name ] = np .asarray (frame .columns ).repeat (N )
707
+ for i , col in enumerate (var_name ):
708
+ # asanyarray will keep the columns as an Index
709
+ mdata [col ] = np .asanyarray (frame .columns .get_level_values (i )).repeat (N )
704
710
705
711
return DataFrame (mdata , columns = mcolumns )
706
712
@@ -718,13 +724,16 @@ def lreshape(data, groups, dropna=True, label=None):
718
724
719
725
Examples
720
726
--------
727
+ >>> import pandas as pd
728
+ >>> data = pd.DataFrame({'hr1': [514, 573], 'hr2': [545, 526],
729
+ ... 'team': ['Red Sox', 'Yankees'],
730
+ ... 'year1': [2007, 2008], 'year2': [2008, 2008]})
721
731
>>> data
722
732
hr1 hr2 team year1 year2
723
733
0 514 545 Red Sox 2007 2008
724
734
1 573 526 Yankees 2007 2008
725
735
726
- >>> pd.lreshape(data, {'year': ['year1', 'year2'],
727
- 'hr': ['hr1', 'hr2']})
736
+ >>> pd.lreshape(data, {'year': ['year1', 'year2'], 'hr': ['hr1', 'hr2']})
728
737
team hr year
729
738
0 Red Sox 514 2007
730
739
1 Yankees 573 2007
0 commit comments