Skip to content

Commit ff895fe

Browse files
committed
Add tests, update docs.
1 parent 11f3fe4 commit ff895fe

File tree

3 files changed

+70
-42
lines changed

3 files changed

+70
-42
lines changed

doc/source/api.rst

+1
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

+5-4
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

+64-38
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,46 @@ def setUp(self):
3030
self.df1.columns = [list('ABC'), list('abc')]
3131
self.df1.columns.names = ['CAP', 'low']
3232

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

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

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

4568
def test_value_vars(self):
46-
result3 = melt(self.df, id_vars=['id1', 'id2'], value_vars='A')
69+
result3 = self.df.melt(id_vars=['id1', 'id2'], value_vars='A')
4770
self.assertEqual(len(result3), 10)
4871

49-
result4 = melt(self.df, id_vars=['id1', 'id2'], value_vars=['A', 'B'])
72+
result4 = self.df.melt(id_vars=['id1', 'id2'], value_vars=['A', 'B'])
5073
expected4 = DataFrame({'id1': self.df['id1'].tolist() * 2,
5174
'id2': self.df['id2'].tolist() * 2,
5275
'variable': ['A'] * 10 + ['B'] * 10,
@@ -65,8 +88,8 @@ def test_value_vars_types(self):
6588
columns=['id1', 'id2', 'variable', 'value'])
6689

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

7295
def test_vars_work_with_multiindex(self):
@@ -77,7 +100,7 @@ def test_vars_work_with_multiindex(self):
77100
'value': self.df1[('B', 'b')],
78101
}, columns=[('A', 'a'), 'CAP', 'low', 'value'])
79102

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

83106
def test_tuple_vars_fail_with_multiindex(self):
@@ -92,26 +115,26 @@ def test_tuple_vars_fail_with_multiindex(self):
92115
for id_vars, value_vars in ((tuple_a, list_b), (list_a, tuple_b),
93116
(tuple_a, tuple_b)):
94117
with tm.assertRaisesRegexp(ValueError, r'MultiIndex'):
95-
melt(self.df1, id_vars=id_vars, value_vars=value_vars)
118+
self.df1.melt(id_vars=id_vars, value_vars=value_vars)
96119

97120
def test_custom_var_name(self):
98-
result5 = melt(self.df, var_name=self.var_name)
121+
result5 = self.df.melt(var_name=self.var_name)
99122
self.assertEqual(result5.columns.tolist(), ['var', 'value'])
100123

101-
result6 = melt(self.df, id_vars=['id1'], var_name=self.var_name)
124+
result6 = self.df.melt(id_vars=['id1'], var_name=self.var_name)
102125
self.assertEqual(result6.columns.tolist(), ['id1', 'var', 'value'])
103126

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

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

113-
result9 = melt(self.df, id_vars=['id1', 'id2'], value_vars=['A', 'B'],
114-
var_name=self.var_name)
136+
result9 = self.df.melt(id_vars=['id1', 'id2'], value_vars=['A', 'B'],
137+
var_name=self.var_name)
115138
expected9 = DataFrame({'id1': self.df['id1'].tolist() * 2,
116139
'id2': self.df['id2'].tolist() * 2,
117140
self.var_name: ['A'] * 10 + ['B'] * 10,
@@ -121,24 +144,24 @@ def test_custom_var_name(self):
121144
tm.assert_frame_equal(result9, expected9)
122145

123146
def test_custom_value_name(self):
124-
result10 = melt(self.df, value_name=self.value_name)
147+
result10 = self.df.melt(value_name=self.value_name)
125148
self.assertEqual(result10.columns.tolist(), ['variable', 'val'])
126149

127-
result11 = melt(self.df, id_vars=['id1'], value_name=self.value_name)
150+
result11 = self.df.melt(id_vars=['id1'], value_name=self.value_name)
128151
self.assertEqual(result11.columns.tolist(), ['id1', 'variable', 'val'])
129152

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

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

140-
result14 = melt(self.df, id_vars=['id1', 'id2'], value_vars=['A', 'B'],
141-
value_name=self.value_name)
163+
result14 = self.df.melt(id_vars=['id1', 'id2'], value_vars=['A', 'B'],
164+
value_name=self.value_name)
142165
expected14 = DataFrame({'id1': self.df['id1'].tolist() * 2,
143166
'id2': self.df['id2'].tolist() * 2,
144167
'variable': ['A'] * 10 + ['B'] * 10,
@@ -150,26 +173,29 @@ def test_custom_value_name(self):
150173

151174
def test_custom_var_and_value_name(self):
152175

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

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

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

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

171-
result19 = melt(self.df, id_vars=['id1', 'id2'], value_vars=['A', 'B'],
172-
var_name=self.var_name, value_name=self.value_name)
196+
result19 = self.df.melt(id_vars=['id1', 'id2'], value_vars=['A', 'B'],
197+
var_name=self.var_name,
198+
value_name=self.value_name)
173199
expected19 = DataFrame({'id1': self.df['id1'].tolist() * 2,
174200
'id2': self.df['id2'].tolist() * 2,
175201
self.var_name: ['A'] * 10 + ['B'] * 10,
@@ -181,17 +207,17 @@ def test_custom_var_and_value_name(self):
181207

182208
df20 = self.df.copy()
183209
df20.columns.name = 'foo'
184-
result20 = melt(df20)
210+
result20 = df20.melt()
185211
self.assertEqual(result20.columns.tolist(), ['foo', 'value'])
186212

187213
def test_col_level(self):
188-
res1 = melt(self.df1, col_level=0)
189-
res2 = melt(self.df1, col_level='CAP')
214+
res1 = self.df1.melt(col_level=0)
215+
res2 = self.df1.melt(col_level='CAP')
190216
self.assertEqual(res1.columns.tolist(), ['CAP', 'value'])
191217
self.assertEqual(res2.columns.tolist(), ['CAP', 'value'])
192218

193219
def test_multiindex(self):
194-
res = pd.melt(self.df1)
220+
res = self.df1.melt()
195221
self.assertEqual(res.columns.tolist(), ['CAP', 'low', 'value'])
196222

197223

0 commit comments

Comments
 (0)