|
1 | 1 | import unittest
|
2 | 2 |
|
3 | 3 | import numpy as np
|
| 4 | +from numpy.testing import assert_equal |
4 | 5 |
|
5 |
| -from pandas import DataFrame, Series, Index |
| 6 | +from pandas import DataFrame, Series, Index, MultiIndex |
6 | 7 | from pandas.tools.merge import concat
|
7 | 8 | from pandas.tools.pivot import pivot_table, crosstab
|
8 | 9 | import pandas.util.testing as tm
|
@@ -62,6 +63,22 @@ def test_pivot_table_nocols(self):
|
62 | 63 | xp = df.pivot_table(rows='cols', aggfunc={'values': 'mean'}).T
|
63 | 64 | tm.assert_frame_equal(rs, xp)
|
64 | 65 |
|
| 66 | + def test_pivot_table_dropna(self): |
| 67 | + df = DataFrame({'amount': {0: 60000, 1: 100000, 2: 50000, 3: 30000}, |
| 68 | + 'customer': {0: 'A', 1: 'A', 2: 'B', 3: 'C'}, |
| 69 | + 'month': {0: 201307, 1: 201309, 2: 201308, 3: 201310}, |
| 70 | + 'product': {0: 'a', 1: 'b', 2: 'c', 3: 'd'}, |
| 71 | + 'quantity': {0: 2000000, 1: 500000, 2: 1000000, 3: 1000000}}) |
| 72 | + pv_col = df.pivot_table('quantity', 'month', ['customer', 'product'], dropna=False) |
| 73 | + pv_ind = df.pivot_table('quantity', ['customer', 'product'], 'month', dropna=False) |
| 74 | + |
| 75 | + m = MultiIndex.from_tuples([(u'A', u'a'), (u'A', u'b'), (u'A', u'c'), (u'A', u'd'), |
| 76 | + (u'B', u'a'), (u'B', u'b'), (u'B', u'c'), (u'B', u'd'), |
| 77 | + (u'C', u'a'), (u'C', u'b'), (u'C', u'c'), (u'C', u'd')]) |
| 78 | + |
| 79 | + assert_equal(pv_col.columns.values, m.values) |
| 80 | + assert_equal(pv_ind.index.values, m.values) |
| 81 | + |
65 | 82 |
|
66 | 83 | def test_pass_array(self):
|
67 | 84 | result = self.data.pivot_table('D', rows=self.data.A, cols=self.data.C)
|
@@ -374,6 +391,16 @@ def test_crosstab_pass_values(self):
|
374 | 391 | aggfunc=np.sum)
|
375 | 392 | tm.assert_frame_equal(table, expected)
|
376 | 393 |
|
| 394 | + def test_crosstab_dropna(self): |
| 395 | + # GH 3820 |
| 396 | + a = np.array(['foo', 'foo', 'foo', 'bar', 'bar', 'foo', 'foo'], dtype=object) |
| 397 | + b = np.array(['one', 'one', 'two', 'one', 'two', 'two', 'two'], dtype=object) |
| 398 | + c = np.array(['dull', 'dull', 'dull', 'dull', 'dull', 'shiny', 'shiny'], dtype=object) |
| 399 | + res = crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c'], dropna=False) |
| 400 | + m = MultiIndex.from_tuples([('one', 'dull'), ('one', 'shiny'), |
| 401 | + ('two', 'dull'), ('two', 'shiny')]) |
| 402 | + assert_equal(res.columns.values, m.values) |
| 403 | + |
377 | 404 | if __name__ == '__main__':
|
378 | 405 | import nose
|
379 | 406 | nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],
|
|
0 commit comments