numpy.log10
is a “ufunc”, and the method Series.apply(func)
has a special test for numpy ufuncs which makes test.apply(log10)
equivalent to np.log10(test)
. This means test
, a Pandas Series
instance, is passed to log10
. The data type of test
is object
, which means that the elements in test
can be arbitrary Python objects. np.log10
doesn’t know how to handle such a collection of objects (it doesn’t “know” that those objects are, in fact, all np.float64
instances), so it attempts to dispatch the calculation to the individual elements in the Series
. To do that, it expects the elements themselves to have a log10
method. That’s when the error occurs: the elements in the Series
(in this case, np.float64
instances) do not have a log10
method.
A couple alternative expression that should do what you want are np.log10(test.astype(np.float64))
or test.astype(np.float64).apply(np.log10)
. The essential part is that test.astype(np.float64)
converts the data type of the Series
object from object
to np.float64
.