From 7153e5fa76131a1726e5519d1d70d5b90caa6c28 Mon Sep 17 00:00:00 2001 From: gfyoung Date: Fri, 23 Nov 2018 10:33:44 -0800 Subject: [PATCH 1/2] TST: Test unnamed columns with index_col for Excel Closes gh-18792. --- doc/source/whatsnew/v0.24.0.rst | 2 +- pandas/tests/io/data/test1.xls | Bin 28160 -> 28672 bytes pandas/tests/io/data/test1.xlsm | Bin 13072 -> 13967 bytes pandas/tests/io/data/test1.xlsx | Bin 12982 -> 13878 bytes pandas/tests/io/test_excel.py | 24 ++++++++++++++++++------ 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/doc/source/whatsnew/v0.24.0.rst b/doc/source/whatsnew/v0.24.0.rst index d0dddb19f4c93..382cd3e5bc74c 100644 --- a/doc/source/whatsnew/v0.24.0.rst +++ b/doc/source/whatsnew/v0.24.0.rst @@ -1402,7 +1402,7 @@ Notice how we now instead output ``np.nan`` itself instead of a stringified form - Bug in :meth:`read_csv()` in which unnecessary warnings were being raised when the dialect's values conflicted with the default arguments (:issue:`23761`) - Bug in :meth:`read_html()` in which the error message was not displaying the valid flavors when an invalid one was provided (:issue:`23549`) - Bug in :meth:`read_excel()` in which extraneous header names were extracted, even though none were specified (:issue:`11733`) -- Bug in :meth:`read_excel()` in which ``index_col=None`` was not being respected and parsing index columns anyway (:issue:`20480`) +- Bug in :meth:`read_excel()` in which ``index_col=None`` was not being respected and parsing index columns anyway (:issue:`18792`, :issue:`20480`) - Bug in :meth:`read_excel()` in which ``usecols`` was not being validated for proper column names when passed in as a string (:issue:`20480`) - :func:`DataFrame.to_string()`, :func:`DataFrame.to_html()`, :func:`DataFrame.to_latex()` will correctly format output when a string is passed as the ``float_format`` argument (:issue:`21625`, :issue:`22270`) diff --git a/pandas/tests/io/data/test1.xls b/pandas/tests/io/data/test1.xls index a5940b2cfa6c2481955bca02e074fdb910c96c67..faf5dc84700c9342356499cb8de5751577fcecca 100644 GIT binary patch delta 1529 zcmZuxYiJx*6h8OPWcHQp&L*2=yVZ6AQDf@HeWjK@vb%ZgwkttJ5ITr9YJG&1=0{uF znzCt2p%rQC9)hjZ{FEq#nk@Yx^hX5|1jRoQiHdD$eKjHGpQ7k^?w#8(mCSPHob#RU zJNL|;yEFL%o4m=+r`YCq((CnJ0GNH|3PXoAu?1}6?+5(AfP)4)&hjkN@F%{V{f*07 zTO$LfdX19;KmurMA-9ARtI@QKKGHg5B_3>q^9-n^lnBt&JJ>L0^d#N)$auU#^xh1z zH-}*yZ;0bHJwOBz{dg~`H7F?9C!5lkf+56tuUG&%FCZ3lc>ymR$1hdKHe6~5xg-o5 zZWIp&ysN~6{?)Ypf-&Pu-Gmsl(_V<}f-TW#!75lLziv(VV=&>D+oW#&@O;Q}FdHl2 ze7GHVxAsWCug&$x+g(2ucm0R!T>nM{&$MMtoUCm{%ytoL-9k3w^8x3 z3E8(s^m8;$Owqd(eYU(V!Ce>&~yYUkmGZpT@cUyK-oNi6RvHM;~k!Im&#uN2d6TD^c$X4;940!hSy?YO& zPeB+?rVgV`4#hiKjWY4dAyv94(FG znc`Un_0}DiG~*(%e+}Ynp|YkhK*9?JfWASGFy4RHE2Iy>aH-w+eF$KGsXkhIlQF=b z%g=QO{3dOa3HDQ8`PQ0BqvnfcfGazx`DL90b1+e^R0R(7NdfS4>L6o_o}Dfhk(fv{ zxE~V-#*6&}K_P&m^lru}3lSp0HCR*gzS#9i3zHS%(HFlIega`Lk8Uzd delta 1159 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 diff --git a/pandas/tests/io/data/test1.xlsx b/pandas/tests/io/data/test1.xlsx index 8f011d06875215861d141a08a904aab89e0dad17..a437d838fe13082f989d7f8ea253f091490c2777 100644 GIT binary patch delta 5385 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 OJ(qtQn{eSj+W!EDg`_qB delta 4233 zcmZu!c{tQ<)E+akjKSD4jI1NZGIl~`m+X>~eNAZWLYA?P5HUX?TVzclyT+ECl$}DB z>_tTO^_%zouIqiT_q)F5uk$?TIp>e(xzByhUHh=sk=0NKLe31L08xQJARbW3zG;2{ z83@E&!O925-R^a36Nfk5{i&qhe5XUXprnL~gUDfyTBS_$R~2EL+J-ToH8WKemzYK> zyNJcu1sVO{zd#5RR(9Xxg_u4be_V_;Ew(T{jmuw(ZClK-yk5?xpuwf=EJ9XXc8d!p zg=c_QNHBYeIfX(8_@?W%-%CQy{Yd!=<)| z^WQ|S;pn{FTSNj+KU0f>xBfR+ji;#04lq zt4l!Tr%25~<4*<9oEsf=0grvjlq#P6n0vxTv65sg^5M|(tEQ&$^frt<47RRnKf5#~ z;YDus?a>3tI}tPOqV|RREu^pZD7O-cRlY^e*gb!5_4p z>f0zxmR!^o&Kut&&p8d-F*+gJikQ=Y5*IicY0-N!Evy?b`qG_Mu6ww6I@3IXccCY8 zW}xApH3Ze|GX_z451OsTAW@++Y$E2B-k+%PjeMb}LN4o$JR)L}K~UqGB?B62O(GU! zW)vm^qoRJNB;RwWofmG#nVE$6NLFoK@=JAQ>6Xyc8aCnB}0`zF`UQfb3Xia3#kL?#_KRg*uqbkwfhrfAvAU|wR6y!fx z76tBF-HW$rObZTYI?>+zewAmcv+NtIhmFdPnq(G*5@%kJ?luiha_@eX|If}pBVYR# zw!UTnHnLd&jaT|g3pe7L_KR?cu-`4uLAHcBD@DoR!s!{t#A=pKruZ9`$5+3!xa`$h zV{H7;AxuH8+3HJ$#m5+j+*&ryZp5{90V}F1totDbY95XnAdm~Wn;!Rc7LpTfb^C3G zhR14*ZShR=4n4Ti`V~2!3v`&wLC^l*G-Xv`YaG`HWW?%^272~br4ly+QO9;iKQU{~ z(45T?`c8m&ZRgeM+Hw!_$&PD3vWs$aaA~^E zOsFwai_&YYe4{ioVbG=DpBt?JPmCWyJ;ea`7NdHvZfkBY68u{Qp-o0t=>dOsyeFeV zZoQw#TNSeM>`Eo==E6@amljUdWI5eD1qU&oWrSI!q{~++$|A43c#x}>{d#eDT;#ot z1S%lR&>8AeK`^Q2Mj=(fP&6417;tG9hjnd6G(`*rdlK9nlNFkts+61WgDxA*4|d3= z>bJqr7n)_w=LeC*FbZs9aDRCn*?m=5mp z_C+~-Z>mitvfV*Pd`iZ)XEk(8F*;3^Sn4uv6&_&5f{(`FL!hwuUBc-?`W}Y?wb+I| zy4!CuI&<1?i-yEJKsAJ+su{)rh5Dz^>t6k((#eAy03E|oUK9elN0Z(+8S+T|VTIAVD67A(=MBiFwY6(6v z`@>-B&O-D-&d&Hlkcf&ZmXTOd8-tLtgRsaYxa4RS7!v0%);<2Ln-{h+tz*&~^o7>6 z(@}3AQcJ1bP=g0|LFD;Y6T>Mfb+um6Wp~+1iED2e2j+yz>Kg8I-yY+(zGR?pE-V*j~KGA{B6I8&r*CLrzQXgv|0F(nMjq^Z>c#S|Gyc2`tVCQvT z``Yf&4kc{Jn}Gev`8$6$YnI;1Hh#H2?E(bSPI-KGd_068{-k+SJMmj4==)<)S2b-x z;;qQ!Rqq-L$}e|huwiWy{KAfJOOB=~&Y45IEGeCe3_nuuWz?#q;tY-`{;C|{wG_On z5J^Xgd%EjyR7OHdHU$VoOBy2lABuVV1Uz)~#`t3&=9^&MGsNL%*PYK>xBXml68RYn zMfH+|uw(g;Mw%6D7~h1bbon@poE`VW8DHtIjR#Zvtu%BGG#wBud~f9l+-EN{iH)G) z;wyw&de!J{twevzupc!o(H5$=;BKkc#qvkL#$W+jXO` z7@yC~nYSmkTvTMthez>4m7XfM5(oF4)Nhsj4tPp3P#qtWt?+9_4cs)UaZHTdEp#~a zlNhe-rI{CZc{MuT32aP8SLF|Xlr0{7TZyI%D;93uHu~W%DeJB7Mm@J zUPcXm<V6Ud`oXOGBv5Y0`i<0jnQF=N_tkZdvEL8t)8lzjUU14r70(0XYO+8u61;?q*0A*L zP>Q3oWwg5Q3%gNW)_GR;9C?5HY?oNUb`$dXrf9#A=O^m-&e~g9G#ACAD6Jlh;Jj?# zAL+4xs@C;=f87`+I(@r);!l%Y=fHxE3ckWwc!0t=@VhU~ukOYuIZvtOAE4;1l5}Ex z_tYSKbk?Kn+4Ed-Z~WqR^*A4U<7D<<>0Atq^RL;PUwvF-wL+t`Q;yS5>BW^2LiSaP zA|6aonO<2=T<7UL21GlVmLf7{v~zis13v~c^q=f|&IKM8aQP2C?Qc3U5LwB;OBjL%DIxk-ZvskW`OWycFQ;Roh#_T5EnU-g>I;v~w%cNg(M>2BSjk9M z%`n{+iizKmw}mMC?FV_i-5oz76xiUtx_iVDw{;5yZZZ3C5rquA zHkabr>j)U5Gw6$3KMxfx-?0YXL0AAMX*l30$OdFfL#yxt>JWfh1`bRLp{tV6@?_+| z?WZnPsv-hpI3t~QaptJm3+HORff@yfhhiJSn(*f*a!SXg^R?1nJNFhp}9_oMvB7 ziT|vw?vy{rRCy>q27+^_U4T|srKyvj`(Hvho^v3QUl`x~A`?>N{Y~Edw^8Od0bv3A zsam59I*Fi=aO=8f1MMZbqrrDM43nt!-;*u77_SG(o1byl;4$q|xndP|F}g9X?^5btmwj%`v+eB$`T1`8@dFB4 zt9F7NUP*DV@c06nZq=)t%@)BI*$C7HTN27V{h{-kxRabm=-R{{vilqi@8B{<4M~hx z+W6KBePPdq3cKK3BSyF`k|^7F6^!Lhv{*WO0^szw~!ln&4r?efEV5-lIpY)@gz!G=dk@RZ6%yIeoFYO<#&K&KQx$Nz1>|Az2#0~FF+9RE-nsY^5e>m^yoynu?dG8m2m zYz6p%LlPI%OS6L+`AJ(OuqiDKX1NSJmO%kGWmrhWzz&WUAZ_J2{-Ona5`OJS2^s#A m@K6vKkm2L_2jC>l3jfcA5Mh8$mYohxIyNN-fwVAxdH)BkrjyVB diff --git a/pandas/tests/io/test_excel.py b/pandas/tests/io/test_excel.py index 741d03a8dc0c2..7cc1f1899db98 100644 --- a/pandas/tests/io/test_excel.py +++ b/pandas/tests/io/test_excel.py @@ -264,6 +264,18 @@ def test_index_col_empty(self, ext): names=["A", "B", "C"])) tm.assert_frame_equal(result, expected) + @pytest.mark.parametrize("index_col", [None, 2]) + def test_index_col_with_unnamed(self, ext, index_col): + # see gh-18792 + result = self.get_exceldf("test1", ext, "Sheet4", + index_col=index_col) + expected = DataFrame([["i1", "a", "x"], ["i2", "b", "y"]], + columns=["Unnamed: 0", "col1", "col2"]) + if index_col: + expected = expected.set_index(expected.columns[index_col]) + + tm.assert_frame_equal(result, expected) + def test_usecols_pass_non_existent_column(self, ext): msg = ("Usecols do not match columns, " "columns expected but not found: " + r"\['E'\]") @@ -923,9 +935,9 @@ def test_read_excel_multiindex_empty_level(self, ext): }) expected = DataFrame({ - ("One", u"x"): {0: 1}, - ("Two", u"X"): {0: 3}, - ("Two", u"Y"): {0: 7}, + ("One", "x"): {0: 1}, + ("Two", "X"): {0: 3}, + ("Two", "Y"): {0: 7}, ("Zero", "Unnamed: 4_level_1"): {0: 0} }) @@ -942,9 +954,9 @@ def test_read_excel_multiindex_empty_level(self, ext): expected = pd.DataFrame({ ("Beg", "Unnamed: 1_level_1"): {0: 0}, - ("Middle", u"x"): {0: 1}, - ("Tail", u"X"): {0: 3}, - ("Tail", u"Y"): {0: 7} + ("Middle", "x"): {0: 1}, + ("Tail", "X"): {0: 3}, + ("Tail", "Y"): {0: 7} }) df.to_excel(path) From 78618500f17b16b0d1867f571475bc5014d9e6d8 Mon Sep 17 00:00:00 2001 From: gfyoung Date: Wed, 28 Nov 2018 05:42:23 -0800 Subject: [PATCH 2/2] BUG: Patch Python 2.x non-conversion of Unicode For column names only. --- doc/source/whatsnew/v0.24.0.rst | 1 + pandas/io/excel.py | 47 +++++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/doc/source/whatsnew/v0.24.0.rst b/doc/source/whatsnew/v0.24.0.rst index 382cd3e5bc74c..2fbd23352feb1 100644 --- a/doc/source/whatsnew/v0.24.0.rst +++ b/doc/source/whatsnew/v0.24.0.rst @@ -1402,6 +1402,7 @@ Notice how we now instead output ``np.nan`` itself instead of a stringified form - Bug in :meth:`read_csv()` in which unnecessary warnings were being raised when the dialect's values conflicted with the default arguments (:issue:`23761`) - Bug in :meth:`read_html()` in which the error message was not displaying the valid flavors when an invalid one was provided (:issue:`23549`) - Bug in :meth:`read_excel()` in which extraneous header names were extracted, even though none were specified (:issue:`11733`) +- Bug in :meth:`read_excel()` in which column names were not being properly converted to string sometimes in Python 2.x (:issue:`23874`) - Bug in :meth:`read_excel()` in which ``index_col=None`` was not being respected and parsing index columns anyway (:issue:`18792`, :issue:`20480`) - Bug in :meth:`read_excel()` in which ``usecols`` was not being validated for proper column names when passed in as a string (:issue:`20480`) - :func:`DataFrame.to_string()`, :func:`DataFrame.to_html()`, :func:`DataFrame.to_latex()` will correctly format output when a string is passed as the ``float_format`` argument (:issue:`21625`, :issue:`22270`) diff --git a/pandas/io/excel.py b/pandas/io/excel.py index 1328713736b03..880ff5a56804f 100644 --- a/pandas/io/excel.py +++ b/pandas/io/excel.py @@ -662,10 +662,14 @@ def _parse_cell(cell_contents, cell_typ): output[asheetname] = parser.read(nrows=nrows) - if ((not squeeze or isinstance(output[asheetname], DataFrame)) - and header_names): - output[asheetname].columns = output[ - asheetname].columns.set_names(header_names) + if not squeeze or isinstance(output[asheetname], DataFrame): + if header_names: + output[asheetname].columns = output[ + asheetname].columns.set_names(header_names) + elif compat.PY2: + output[asheetname].columns = _maybe_convert_to_string( + output[asheetname].columns) + except EmptyDataError: # No Data, return an empty DataFrame output[asheetname] = DataFrame() @@ -810,6 +814,39 @@ def _trim_excel_header(row): return row +def _maybe_convert_to_string(row): + """ + Convert elements in a row to string from Unicode. + + This is purely a Python 2.x patch and is performed ONLY when all + elements of the row are string-like. + + Parameters + ---------- + row : array-like + The row of data to convert. + + Returns + ------- + converted : array-like + """ + if compat.PY2: + converted = [] + + for i in range(len(row)): + if isinstance(row[i], compat.string_types): + try: + converted.append(str(row[i])) + except UnicodeEncodeError: + break + else: + break + else: + row = converted + + return row + + def _fill_mi_header(row, control_row): """Forward fills blank entries in row, but only inside the same parent index @@ -838,7 +875,7 @@ def _fill_mi_header(row, control_row): control_row[i] = False last = row[i] - return row, control_row + return _maybe_convert_to_string(row), control_row # fill blank if index_col not None