Skip to content

Commit f9ce292

Browse files
committed
fix #804 : removed trailing NaNs and None values when extracting Axis and Group objects from __axes__ and __groups__ special sheets/csv files
1 parent 26ab2ba commit f9ce292

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

doc/source/changes/version_0_32.rst.inc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,6 @@ Fixes
5757

5858
* fixed reading/exporting sessions containing two or more axes/groups
5959
with the same name (or anonymous) from/to CSV, Excel and HDF files (closes :issue:`803`).
60+
61+
* fixed NaNs and None labels appearing in axes and groups when reading/exporting sessions
62+
from/to CSV and Excel files (closes :issue:`804`).

larray/inout/pandas.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,19 +338,38 @@ def df_aslarray(df, sort_rows=False, sort_columns=False, raw=False, parse_header
338338
# SERIES <--> AXIS, GROUP, META #
339339
# #################################### #
340340

341+
def _extract_labels_from_series(series):
342+
# remove trailing NaN or None values
343+
# (multiple Axis or Group objects of different lengths
344+
# are stored in the same DataFrame leading to trailing
345+
# NaNs or None values when split into series)
346+
series = series.loc[:series.last_valid_index()]
347+
348+
labels = np.asarray(series.values)
349+
# integer labels of axes or groups may have been converted to float values
350+
# because of trailing NaNs
351+
if labels.dtype.kind == 'f' and all([label.is_integer() for label in labels]):
352+
labels = labels.astype(int)
353+
# if dtype is still object, we assume values are strings
354+
if labels.dtype.kind == 'O':
355+
labels = labels.astype(str)
356+
return labels
357+
358+
341359
def _axis_to_series(key, axis, dtype=None):
342360
name = '{}:{}'.format(key, axis.name)
343361
return pd.Series(data=axis.labels, name=name, dtype=dtype)
344362

345363

346364
def _series_to_axis(series):
347365
name = str(series.name)
366+
labels = _extract_labels_from_series(series)
348367
if ':' in name:
349368
key, axis_name = name.split(':')
350369
else:
351370
# for backward compatibility
352371
key = axis_name = name
353-
return key, Axis(labels=series.values, name=axis_name)
372+
return key, Axis(labels=labels, name=axis_name)
354373

355374

356375
def _group_to_series(key, group, dtype=None):
@@ -366,7 +385,8 @@ def _series_to_group(series, axes):
366385
if group_name == 'None':
367386
group_name = None
368387
axis = axes[axis_name]
369-
return key, LGroup(key=series.values, name=group_name, axis=axis)
388+
group_key = _extract_labels_from_series(series)
389+
return key, LGroup(key=group_key, name=group_name, axis=axis)
370390

371391

372392
# ######################################## #

0 commit comments

Comments
 (0)