Skip to content

Commit 5c75672

Browse files
committed
Add tests, update docs.
1 parent 4f2e724 commit 5c75672

File tree

3 files changed

+70
-42
lines changed

3 files changed

+70
-42
lines changed

doc/source/api.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,7 @@ Reshaping, sorting, transposing
933933
DataFrame.swaplevel
934934
DataFrame.stack
935935
DataFrame.unstack
936+
DataFrame.melt
936937
DataFrame.T
937938
DataFrame.to_panel
938939
DataFrame.to_xarray

doc/source/reshaping.rst

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ the right thing:
265265
Reshaping by Melt
266266
-----------------
267267

268-
The :func:`~pandas.melt` function is useful to massage a
268+
The :func:`~DataFrame.melt` function is useful to massage a
269269
DataFrame into a format where one or more columns are identifier variables,
270270
while all other columns, considered measured variables, are "unpivoted" to the
271271
row axis, leaving just two non-identifier columns, "variable" and "value". The
@@ -281,10 +281,11 @@ For instance,
281281
'height' : [5.5, 6.0],
282282
'weight' : [130, 150]})
283283
cheese
284-
pd.melt(cheese, id_vars=['first', 'last'])
285-
pd.melt(cheese, id_vars=['first', 'last'], var_name='quantity')
284+
cheese.melt(id_vars=['first', 'last'])
285+
cheese.melt(id_vars=['first', 'last'], var_name='quantity')
286286
287-
Another way to transform is to use the ``wide_to_long`` panel data convenience function.
287+
Another way to transform is to use the ``wide_to_long`` panel data convenience
288+
function.
288289

289290
.. ipython:: python
290291

pandas/tests/test_reshape.py

Lines changed: 64 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,46 @@ def setUp(self):
3131
self.df1.columns = [list('ABC'), list('abc')]
3232
self.df1.columns.names = ['CAP', 'low']
3333

34-
def test_default_col_names(self):
34+
def test_top_level_method(self):
3535
result = melt(self.df)
3636
self.assertEqual(result.columns.tolist(), ['variable', 'value'])
3737

38-
result1 = melt(self.df, id_vars=['id1'])
38+
def test_method_signatures(self):
39+
tm.assert_frame_equal(self.df.melt(),
40+
melt(self.df))
41+
42+
tm.assert_frame_equal(self.df.melt(id_vars=['id1', 'id2'],
43+
value_vars=['A', 'B']),
44+
melt(self.df,
45+
id_vars=['id1', 'id2'],
46+
value_vars=['A', 'B']))
47+
48+
tm.assert_frame_equal(self.df.melt(var_name=self.var_name,
49+
value_name=self.value_name),
50+
melt(self.df,
51+
var_name=self.var_name,
52+
value_name=self.value_name))
53+
54+
tm.assert_frame_equal(self.df1.melt(col_level=0),
55+
melt(self.df1, col_level=0))
56+
57+
def test_default_col_names(self):
58+
result = self.df.melt()
59+
self.assertEqual(result.columns.tolist(), ['variable', 'value'])
60+
61+
result1 = self.df.melt(id_vars=['id1'])
3962
self.assertEqual(result1.columns.tolist(), ['id1', 'variable', 'value'
4063
])
4164

42-
result2 = melt(self.df, id_vars=['id1', 'id2'])
65+
result2 = self.df.melt(id_vars=['id1', 'id2'])
4366
self.assertEqual(result2.columns.tolist(), ['id1', 'id2', 'variable',
4467
'value'])
4568

4669
def test_value_vars(self):
47-
result3 = melt(self.df, id_vars=['id1', 'id2'], value_vars='A')
70+
result3 = self.df.melt(id_vars=['id1', 'id2'], value_vars='A')
4871
self.assertEqual(len(result3), 10)
4972

50-
result4 = melt(self.df, id_vars=['id1', 'id2'], value_vars=['A', 'B'])
73+
result4 = self.df.melt(id_vars=['id1', 'id2'], value_vars=['A', 'B'])
5174
expected4 = DataFrame({'id1': self.df['id1'].tolist() * 2,
5275
'id2': self.df['id2'].tolist() * 2,
5376
'variable': ['A'] * 10 + ['B'] * 10,
@@ -66,8 +89,8 @@ def test_value_vars_types(self):
6689
columns=['id1', 'id2', 'variable', 'value'])
6790

6891
for type_ in (tuple, list, np.array):
69-
result = melt(self.df, id_vars=['id1', 'id2'],
70-
value_vars=type_(('A', 'B')))
92+
result = self.df.melt(id_vars=['id1', 'id2'],
93+
value_vars=type_(('A', 'B')))
7194
tm.assert_frame_equal(result, expected)
7295

7396
def test_vars_work_with_multiindex(self):
@@ -78,7 +101,7 @@ def test_vars_work_with_multiindex(self):
78101
'value': self.df1[('B', 'b')],
79102
}, columns=[('A', 'a'), 'CAP', 'low', 'value'])
80103

81-
result = melt(self.df1, id_vars=[('A', 'a')], value_vars=[('B', 'b')])
104+
result = self.df1.melt(id_vars=[('A', 'a')], value_vars=[('B', 'b')])
82105
tm.assert_frame_equal(result, expected)
83106

84107
def test_tuple_vars_fail_with_multiindex(self):
@@ -93,26 +116,26 @@ def test_tuple_vars_fail_with_multiindex(self):
93116
for id_vars, value_vars in ((tuple_a, list_b), (list_a, tuple_b),
94117
(tuple_a, tuple_b)):
95118
with tm.assertRaisesRegexp(ValueError, r'MultiIndex'):
96-
melt(self.df1, id_vars=id_vars, value_vars=value_vars)
119+
self.df1.melt(id_vars=id_vars, value_vars=value_vars)
97120

98121
def test_custom_var_name(self):
99-
result5 = melt(self.df, var_name=self.var_name)
122+
result5 = self.df.melt(var_name=self.var_name)
100123
self.assertEqual(result5.columns.tolist(), ['var', 'value'])
101124

102-
result6 = melt(self.df, id_vars=['id1'], var_name=self.var_name)
125+
result6 = self.df.melt(id_vars=['id1'], var_name=self.var_name)
103126
self.assertEqual(result6.columns.tolist(), ['id1', 'var', 'value'])
104127

105-
result7 = melt(self.df, id_vars=['id1', 'id2'], var_name=self.var_name)
128+
result7 = self.df.melt(id_vars=['id1', 'id2'], var_name=self.var_name)
106129
self.assertEqual(result7.columns.tolist(), ['id1', 'id2', 'var',
107130
'value'])
108131

109-
result8 = melt(self.df, id_vars=['id1', 'id2'], value_vars='A',
110-
var_name=self.var_name)
132+
result8 = self.df.melt(id_vars=['id1', 'id2'], value_vars='A',
133+
var_name=self.var_name)
111134
self.assertEqual(result8.columns.tolist(), ['id1', 'id2', 'var',
112135
'value'])
113136

114-
result9 = melt(self.df, id_vars=['id1', 'id2'], value_vars=['A', 'B'],
115-
var_name=self.var_name)
137+
result9 = self.df.melt(id_vars=['id1', 'id2'], value_vars=['A', 'B'],
138+
var_name=self.var_name)
116139
expected9 = DataFrame({'id1': self.df['id1'].tolist() * 2,
117140
'id2': self.df['id2'].tolist() * 2,
118141
self.var_name: ['A'] * 10 + ['B'] * 10,
@@ -122,24 +145,24 @@ def test_custom_var_name(self):
122145
tm.assert_frame_equal(result9, expected9)
123146

124147
def test_custom_value_name(self):
125-
result10 = melt(self.df, value_name=self.value_name)
148+
result10 = self.df.melt(value_name=self.value_name)
126149
self.assertEqual(result10.columns.tolist(), ['variable', 'val'])
127150

128-
result11 = melt(self.df, id_vars=['id1'], value_name=self.value_name)
151+
result11 = self.df.melt(id_vars=['id1'], value_name=self.value_name)
129152
self.assertEqual(result11.columns.tolist(), ['id1', 'variable', 'val'])
130153

131-
result12 = melt(self.df, id_vars=['id1', 'id2'],
132-
value_name=self.value_name)
154+
result12 = self.df.melt(id_vars=['id1', 'id2'],
155+
value_name=self.value_name)
133156
self.assertEqual(result12.columns.tolist(), ['id1', 'id2', 'variable',
134157
'val'])
135158

136-
result13 = melt(self.df, id_vars=['id1', 'id2'], value_vars='A',
137-
value_name=self.value_name)
159+
result13 = self.df.melt(id_vars=['id1', 'id2'], value_vars='A',
160+
value_name=self.value_name)
138161
self.assertEqual(result13.columns.tolist(), ['id1', 'id2', 'variable',
139162
'val'])
140163

141-
result14 = melt(self.df, id_vars=['id1', 'id2'], value_vars=['A', 'B'],
142-
value_name=self.value_name)
164+
result14 = self.df.melt(id_vars=['id1', 'id2'], value_vars=['A', 'B'],
165+
value_name=self.value_name)
143166
expected14 = DataFrame({'id1': self.df['id1'].tolist() * 2,
144167
'id2': self.df['id2'].tolist() * 2,
145168
'variable': ['A'] * 10 + ['B'] * 10,
@@ -151,26 +174,29 @@ def test_custom_value_name(self):
151174

152175
def test_custom_var_and_value_name(self):
153176

154-
result15 = melt(self.df, var_name=self.var_name,
155-
value_name=self.value_name)
177+
result15 = self.df.melt(var_name=self.var_name,
178+
value_name=self.value_name)
156179
self.assertEqual(result15.columns.tolist(), ['var', 'val'])
157180

158-
result16 = melt(self.df, id_vars=['id1'], var_name=self.var_name,
159-
value_name=self.value_name)
181+
result16 = self.df.melt(id_vars=['id1'], var_name=self.var_name,
182+
value_name=self.value_name)
160183
self.assertEqual(result16.columns.tolist(), ['id1', 'var', 'val'])
161184

162-
result17 = melt(self.df, id_vars=['id1', 'id2'],
163-
var_name=self.var_name, value_name=self.value_name)
185+
result17 = self.df.melt(id_vars=['id1', 'id2'],
186+
var_name=self.var_name,
187+
value_name=self.value_name)
164188
self.assertEqual(result17.columns.tolist(), ['id1', 'id2', 'var', 'val'
165189
])
166190

167-
result18 = melt(self.df, id_vars=['id1', 'id2'], value_vars='A',
168-
var_name=self.var_name, value_name=self.value_name)
191+
result18 = self.df.melt(id_vars=['id1', 'id2'], value_vars='A',
192+
var_name=self.var_name,
193+
value_name=self.value_name)
169194
self.assertEqual(result18.columns.tolist(), ['id1', 'id2', 'var', 'val'
170195
])
171196

172-
result19 = melt(self.df, id_vars=['id1', 'id2'], value_vars=['A', 'B'],
173-
var_name=self.var_name, value_name=self.value_name)
197+
result19 = self.df.melt(id_vars=['id1', 'id2'], value_vars=['A', 'B'],
198+
var_name=self.var_name,
199+
value_name=self.value_name)
174200
expected19 = DataFrame({'id1': self.df['id1'].tolist() * 2,
175201
'id2': self.df['id2'].tolist() * 2,
176202
self.var_name: ['A'] * 10 + ['B'] * 10,
@@ -182,17 +208,17 @@ def test_custom_var_and_value_name(self):
182208

183209
df20 = self.df.copy()
184210
df20.columns.name = 'foo'
185-
result20 = melt(df20)
211+
result20 = df20.melt()
186212
self.assertEqual(result20.columns.tolist(), ['foo', 'value'])
187213

188214
def test_col_level(self):
189-
res1 = melt(self.df1, col_level=0)
190-
res2 = melt(self.df1, col_level='CAP')
215+
res1 = self.df1.melt(col_level=0)
216+
res2 = self.df1.melt(col_level='CAP')
191217
self.assertEqual(res1.columns.tolist(), ['CAP', 'value'])
192218
self.assertEqual(res2.columns.tolist(), ['CAP', 'value'])
193219

194220
def test_multiindex(self):
195-
res = pd.melt(self.df1)
221+
res = self.df1.melt()
196222
self.assertEqual(res.columns.tolist(), ['CAP', 'low', 'value'])
197223

198224

0 commit comments

Comments
 (0)