Skip to content

Commit 90af5d2

Browse files
Bruno P. Kinoshitakinow
Bruno P. Kinoshita
authored andcommitted
Try with cython code adapted from another function
1 parent d07b7a7 commit 90af5d2

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

pandas/_libs/writers.pyx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,19 +127,28 @@ def max_len_string_array(pandas_string[:] arr) -> Py_ssize_t:
127127

128128
for i in range(length):
129129
val = arr[i]
130-
if isinstance(val, str):
131-
l = PyString_GET_SIZE(val)
132-
elif isinstance(val, bytes):
133-
l = PyBytes_GET_SIZE(val)
134-
elif isinstance(val, unicode):
135-
l = PyUnicode_GET_SIZE(val)
130+
l = max_len_string(val)
136131

137132
if l > m:
138133
m = l
139134

140135
return m
141136

142137

138+
def max_len_string(val):
139+
""" return the maximum size of a string"""
140+
cdef:
141+
Py_ssize_t l = 0
142+
143+
if isinstance(val, str):
144+
l = PyString_GET_SIZE(val)
145+
elif isinstance(val, bytes):
146+
l = PyBytes_GET_SIZE(val)
147+
elif isinstance(val, unicode):
148+
l = PyUnicode_GET_SIZE(val)
149+
150+
return l
151+
143152
# ------------------------------------------------------------------
144153
# PyTables Helpers
145154

pandas/core/internals/blocks.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import numpy as np
1010

11-
from pandas._libs import internals as libinternals, lib, tslib, tslibs
11+
from pandas._libs import internals as libinternals, lib, tslib, tslibs, writers
1212
from pandas._libs.tslibs import Timedelta, conversion, is_null_datetimelike
1313
import pandas.compat as compat
1414
from pandas.compat import range, zip
@@ -726,8 +726,9 @@ def to_native_types(self, slicer=None, na_rep='nan', quoting=None,
726726
mask = isna(values)
727727

728728
if not self.is_object and not quoting:
729-
if na_rep and isinstance(na_rep, str):
730-
values = values.astype("<U{length}".format(length=len(na_rep)))
729+
if na_rep is not None and isinstance(na_rep, (str, bytes)):
730+
itemsize = writers.max_len_string(na_rep)
731+
values = values.astype("<U{size}".format(size=itemsize))
731732
else:
732733
values = values.astype(str)
733734
else:

pandas/tests/io/formats/test_to_csv.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import numpy as np
77
import pytest
88

9+
from pandas.compat import StringIO
10+
911
import pandas as pd
1012
from pandas import DataFrame, compat
1113
from pandas.util import testing as tm

0 commit comments

Comments
 (0)