Skip to content

Commit 00932b1

Browse files
Chang Shewesm
Chang She
authored andcommitted
ENH: squeeze keyword to return single col frame as series. #1253
1 parent 0600425 commit 00932b1

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

pandas/io/parsers.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ class DateConversionError(Exception):
8585
Alternative argument name for sep
8686
encoding : string, default None
8787
Encoding to use for UTF when reading/writing (ex. 'utf-8')
88+
squeeze : boolean, default False
89+
If the parsed data only contains one column then return a Series
8890
8991
Returns
9092
-------
@@ -205,7 +207,8 @@ def read_csv(filepath_or_buffer,
205207
converters=None,
206208
verbose=False,
207209
delimiter=None,
208-
encoding=None):
210+
encoding=None,
211+
squeeze=False):
209212
kwds = locals()
210213

211214
# Alias sep -> delimiter.
@@ -236,7 +239,8 @@ def read_table(filepath_or_buffer,
236239
converters=None,
237240
verbose=False,
238241
delimiter=None,
239-
encoding=None):
242+
encoding=None,
243+
squeeze=False):
240244
kwds = locals()
241245

242246
# Alias sep -> delimiter.
@@ -271,7 +275,8 @@ def read_fwf(filepath_or_buffer,
271275
converters=None,
272276
delimiter=None,
273277
verbose=False,
274-
encoding=None):
278+
encoding=None,
279+
squeeze=False):
275280

276281
kwds = locals()
277282

@@ -372,14 +377,16 @@ class TextParser(object):
372377
Number of line at bottom of file to skip
373378
encoding : string, default None
374379
Encoding to use for UTF when reading/writing (ex. 'utf-8')
380+
squeeze : boolean, default False
381+
returns Series if only one column
375382
"""
376383

377384
def __init__(self, f, delimiter=None, names=None, header=0,
378385
index_col=None, na_values=None, thousands=None,
379386
comment=None, parse_dates=False, keep_date_col=False,
380387
date_parser=None, dayfirst=False,
381388
chunksize=None, skiprows=None, skip_footer=0, converters=None,
382-
verbose=False, encoding=None):
389+
verbose=False, encoding=None, squeeze=False):
383390
"""
384391
Workhorse function for processing nested list into DataFrame
385392
@@ -439,6 +446,7 @@ def __init__(self, f, delimiter=None, names=None, header=0,
439446
self.index_name = self._get_index_name()
440447
self._first_chunk = True
441448

449+
self.squeeze = squeeze
442450

443451
def _make_reader(self, f):
444452
import csv
@@ -755,7 +763,10 @@ def get_chunk(self, rows=None):
755763

756764
data = _convert_to_ndarrays(data, self.na_values, self.verbose)
757765

758-
return DataFrame(data=data, columns=columns, index=index)
766+
df = DataFrame(data=data, columns=columns, index=index)
767+
if self.squeeze and len(df.columns) == 1:
768+
return df[df.columns[0]]
769+
return df
759770

760771
def _find_line_number(self, exp_len, chunk_len, chunk_i):
761772
if exp_len is None:

pandas/io/tests/test_parsers.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@
1111
from numpy import nan
1212
import numpy as np
1313

14-
from pandas import DataFrame, Index, isnull
14+
from pandas import DataFrame, Series, Index, isnull
1515
import pandas.io.parsers as parsers
1616
from pandas.io.parsers import (read_csv, read_table, read_fwf,
1717
ExcelFile, TextParser)
18-
from pandas.util.testing import assert_almost_equal, assert_frame_equal, network
18+
from pandas.util.testing import (assert_almost_equal, assert_frame_equal,
19+
assert_series_equal, network)
1920
import pandas._tseries as lib
2021
from pandas.util import py3compat
2122
from pandas._tseries import Timestamp
@@ -91,6 +92,18 @@ def test_comment_fwf(self):
9192
comment='#')
9293
assert_almost_equal(df.values, expected)
9394

95+
def test_squeeze(self):
96+
data = """\
97+
a,1
98+
b,2
99+
c,3
100+
"""
101+
expected = Series([1,2,3], ['a', 'b', 'c'])
102+
result = read_table(StringIO(data), sep=',', index_col=0,
103+
header=None, squeeze=True)
104+
self.assert_(isinstance(result, Series))
105+
assert_series_equal(result, expected)
106+
94107
def test_multiple_date_col(self):
95108
# Can use multiple date parsers
96109
data = """\

0 commit comments

Comments
 (0)