Skip to content

Commit f6c09b1

Browse files
Bruno P. Kinoshitakinow
Bruno P. Kinoshita
authored andcommitted
Try with cython code adapted from another function
1 parent 7d24179 commit f6c09b1

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

pandas/_libs/writers.pyx

+15-6
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,28 @@ def max_len_string_array(pandas_string[:] arr) -> Py_ssize_t:
128128

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

138133
if l > m:
139134
m = l
140135

141136
return m
142137

143138

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

pandas/core/internals/blocks.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import numpy as np
99

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

741741
if not self.is_object and not quoting:
742-
if na_rep and isinstance(na_rep, str):
743-
values = values.astype("<U{length}".format(length=len(na_rep)))
742+
if na_rep is not None and isinstance(na_rep, (str, bytes)):
743+
itemsize = writers.max_len_string(na_rep)
744+
values = values.astype("<U{size}".format(size=itemsize))
744745
else:
745746
values = values.astype(str)
746747
else:

pandas/tests/io/formats/test_to_csv.py

+2
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)