AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

Question:

Str.replace method returns an attribute error.

dc_listings['price'].str.replace(',', '')
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

Here are the top 5 rows of my price column.

enter image description here

This stack overflow thread recommends to check if my column has NAN values but non of the values in my column are NAN.
enter image description here

Asked By: MJP

||

Answers:

As the error states, you can only use .str with string columns, and you have a float64. There won’t be any commas in a float, so what you have won’t really do anything, but in general, you could cast it first:

dc_listings['price'].astype(str).str.replace...

For example:

In [18]: df
Out[18]:
          a         b         c         d         e
0  0.645821  0.152197  0.006956  0.600317  0.239679
1  0.865723  0.176842  0.226092  0.416990  0.290406
2  0.046243  0.931584  0.020109  0.374653  0.631048
3  0.544111  0.967388  0.526613  0.794931  0.066736
4  0.528742  0.670885  0.998077  0.293623  0.351879

In [19]: df['a'].astype(str).str.replace("5", " hi ")
Out[19]:
0    0.64 hi 8208 hi  hi 4779467
1          0.86 hi 7231174332336
2            0.04624337481411367
3       0. hi 44111244991 hi 194
4          0. hi 287421814241892
Name: a, dtype: object
Answered By: Randy

If price is a dtype float 64 then the data is not a string.
You can try dc_listings['price'].apply(function)

Answered By: Subhash

Two ways:

  1. You can use series to fix this error.

    dc_listings['price'].series.str.replace(',', '')
    

  1. And if series doesn’t work you can also alteratively use apply(str) as shown below:

    dc_listings['price'].apply(str).str.replace(',', '')
    
Answered By: Mitushi Ananya

Randy has the solution to handle your problem with changing the whole column into str type. But when you have non-str-type value (like NA, list, dict, a custom class) inside that column and wanted to filter those special values in the future, i suggest you create your own function and then apply it to the str value only, like this:

dc_listings['price'] = dc_listings['price'].apply(
   lambda x: x.replace(',', '') if type(x) is str else x
)

or more clearly, using def :

def replace_substring_or_return_value(value):
  if type(value) is str: return x.replace(',', '')
  else: return value

dc_listings['price'] = dc_listings['price'].apply(
      replace_substring_or_return_value
)

ALTHOUGH this might be a bad practice, because you should use the same data type for every value in a column

Answered By: huynv

first step is convert a numerical values(like int,float) to string values(like object) after you can perform a function.

For example….

df[‘column_name’]=df[‘column_name’].astype("int/float").astype(‘str’)

After this step you can perform a any string fuctions……

Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.