You have four main options for converting types in pandas:

  1. to_numeric() - provides functionality to safely convert non-numeric types (e.g. strings) to a suitable numeric type. (See also to_datetime() and to_timedelta().)

  2. astype() - convert (almost) any type to (almost) any other type (even if it's not necessarily sensible to do so). Also allows you to convert to categorial types (very useful).

  3. infer_objects() - a utility method to convert object columns holding Python objects to a pandas type if possible.

  4. convert_dtypes() - convert DataFrame columns to the "best possible" dtype that supports pd.NA (pandas' object to indicate a missing value).

Read on for more detailed explanations and usage of each of these methods.


1. to_numeric()

The best way to convert one or more columns of a DataFrame to numeric values is to use pandas.to_numeric().

This function will try to change non-numeric objects (such as strings) into integers or floating-point numbers as appropriate.

Basic usage

The input to to_numeric() is a Series or a single column of a DataFrame.

>>> s = pd.Series(["8", 6, "7.5", 3, "0.9"]) # mixed string and numeric values
>>> s
0      8
1      6
2    7.5
3      3
4    0.9
dtype: object

>>> pd.to_numeric(s) # convert everything to float values
0    8.0
1    6.0
2    7.5
3    3.0
4    0.9
dtype: float64

As you can see, a new Series is returned. Remember to assign this output to a variable or column name to continue using it:

# convert Series
my_series = pd.to_numeric(my_series)

# convert column "a" of a DataFrame
df["a"] = pd.to_numeric(df["a"])

You can also use it to convert multiple columns of a DataFrame via the apply() method:

# convert all columns of DataFrame
df = df.apply(pd.to_numeric) # convert all columns of DataFrame

# convert just columns "a" and "b"
df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)

As long as your values can all be converted, that's probably all you need.

Error handling

But what if some values can't be converted to a numeric type?

to_numeric() also takes an errors keyword argument that allows you to force non-numeric values to be NaN, or simply ignore columns containing these values.

Here's an example using a Series of strings s which has the object dtype:

>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0         1
1         2
2       4.7
3    pandas
4        10
dtype: object

The default behaviour is to raise if it can't convert a value. In this case, it can't cope with the string 'pandas':

>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string

Rather than fail, we might want 'pandas' to be considered a missing/bad numeric value. We can coerce invalid values to NaN as follows using the errors keyword argument:

>>> pd.to_numeric(s, errors='coerce')
0     1.0
1     2.0
2     4.7
3     NaN
4    10.0
dtype: float64

The third option for errors is just to ignore the operation if an invalid value is encountered:

>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched

This last option is particularly useful for converting your entire DataFrame, but don't know which of our columns can be converted reliably to a numeric type. In that case, just write:

df.apply(pd.to_numeric, errors='ignore')

The function will be applied to each column of the DataFrame. Columns that can be converted to a numeric type will be converted, while columns that cannot (e.g. they contain non-digit strings or dates) will be left alone.

Downcasting

By default, conversion with to_numeric() will give you either an int64 or float64 dtype (or whatever integer width is native to your platform).

That's usually what you want, but what if you wanted to save some memory and use a more compact dtype, like float32, or int8?

to_numeric() gives you the option to downcast to either 'integer', 'signed', 'unsigned', 'float'. Here's an example for a simple series s of integer type:

>>> s = pd.Series([1, 2, -7])
>>> s
0    1
1    2
2   -7
dtype: int64

Downcasting to 'integer' uses the smallest possible integer that can hold the values:

>>> pd.to_numeric(s, downcast='integer')
0    1
1    2
2   -7
dtype: int8

Downcasting to 'float' similarly picks a smaller than normal floating type:

>>> pd.to_numeric(s, downcast='float')
0    1.0
1    2.0
2   -7.0
dtype: float32

2. astype()

The astype() method enables you to be explicit about the dtype you want your DataFrame or Series to have. It's very versatile in that you can try and go from one type to any other.

Basic usage

Just pick a type: you can use a NumPy dtype (e.g. np.int16), some Python types (e.g. bool), or pandas-specific types (like the categorical dtype).

Call the method on the object you want to convert and astype() will try and convert it for you:

# convert all DataFrame columns to the int64 dtype
df = df.astype(int)

# convert column "a" to int64 dtype and "b" to complex type
df = df.astype({"a": int, "b": complex})

# convert Series to float16 type
s = s.astype(np.float16)

# convert Series to Python strings
s = s.astype(str)

# convert Series to categorical type - see docs for more details
s = s.astype('category')

Notice I said "try" - if astype() does not know how to convert a value in the Series or DataFrame, it will raise an error. For example, if you have a NaN or inf value you'll get an error trying to convert it to an integer.

As of pandas 0.20.0, this error can be suppressed by passing errors='ignore'. Your original object will be returned untouched.

Be careful

astype() is powerful, but it will sometimes convert values "incorrectly". For example:

>>> s = pd.Series([1, 2, -7])
>>> s
0    1
1    2
2   -7
dtype: int64

These are small integers, so how about converting to an unsigned 8-bit type to save memory?

>>> s.astype(np.uint8)
0      1
1      2
2    249
dtype: uint8

The conversion worked, but the -7 was wrapped round to become 249 (i.e. 28 - 7)!

Trying to downcast using pd.to_numeric(s, downcast='unsigned') instead could help prevent this error.


3. infer_objects()

Version 0.21.0 of pandas introduced the method infer_objects() for converting columns of a DataFrame that have an object datatype to a more specific type (soft conversions).

For example, here's a DataFrame with two columns of object type. One holds actual integers and the other holds strings representing integers:

>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a    object
b    object
dtype: object

Using infer_objects(), you can change the type of column 'a' to int64:

>>> df = df.infer_objects()
>>> df.dtypes
a     int64
b    object
dtype: object

Column 'b' has been left alone since its values were strings, not integers. If you wanted to force both columns to an integer type, you could use df.astype(int) instead.


4. convert_dtypes()

Version 1.0 and above includes a method convert_dtypes() to convert Series and DataFrame columns to the best possible dtype that supports the pd.NA missing value.

Here "best possible" means the type most suited to hold the values. For example, this a pandas integer type, if all of the values are integers (or missing values): an object column of Python integer objects are converted to Int64, a column of NumPy int32 values, will become the pandas dtype Int32.

With our object DataFrame df, we get the following result:

>>> df.convert_dtypes().dtypes                                             
a     Int64
b    string
dtype: object

Since column 'a' held integer values, it was converted to the Int64 type (which is capable of holding missing values, unlike int64).

Column 'b' contained string objects, so was changed to pandas' string dtype.

By default, this method will infer the type from object values in each column. We can change this by passing infer_objects=False:

>>> df.convert_dtypes(infer_objects=False).dtypes                          
a    object
b    string
dtype: object

Now column 'a' remained an object column: pandas knows it can be described as an 'integer' column (internally it ran infer_dtype) but didn't infer exactly what dtype of integer it should have so did not convert it. Column 'b' was again converted to 'string' dtype as it was recognised as holding 'string' values.

Answer from Alex Riley on Stack Overflow
Top answer
1 of 16
2641

You have four main options for converting types in pandas:

  1. to_numeric() - provides functionality to safely convert non-numeric types (e.g. strings) to a suitable numeric type. (See also to_datetime() and to_timedelta().)

  2. astype() - convert (almost) any type to (almost) any other type (even if it's not necessarily sensible to do so). Also allows you to convert to categorial types (very useful).

  3. infer_objects() - a utility method to convert object columns holding Python objects to a pandas type if possible.

  4. convert_dtypes() - convert DataFrame columns to the "best possible" dtype that supports pd.NA (pandas' object to indicate a missing value).

Read on for more detailed explanations and usage of each of these methods.


1. to_numeric()

The best way to convert one or more columns of a DataFrame to numeric values is to use pandas.to_numeric().

This function will try to change non-numeric objects (such as strings) into integers or floating-point numbers as appropriate.

Basic usage

The input to to_numeric() is a Series or a single column of a DataFrame.

>>> s = pd.Series(["8", 6, "7.5", 3, "0.9"]) # mixed string and numeric values
>>> s
0      8
1      6
2    7.5
3      3
4    0.9
dtype: object

>>> pd.to_numeric(s) # convert everything to float values
0    8.0
1    6.0
2    7.5
3    3.0
4    0.9
dtype: float64

As you can see, a new Series is returned. Remember to assign this output to a variable or column name to continue using it:

# convert Series
my_series = pd.to_numeric(my_series)

# convert column "a" of a DataFrame
df["a"] = pd.to_numeric(df["a"])

You can also use it to convert multiple columns of a DataFrame via the apply() method:

# convert all columns of DataFrame
df = df.apply(pd.to_numeric) # convert all columns of DataFrame

# convert just columns "a" and "b"
df[["a", "b"]] = df[["a", "b"]].apply(pd.to_numeric)

As long as your values can all be converted, that's probably all you need.

Error handling

But what if some values can't be converted to a numeric type?

to_numeric() also takes an errors keyword argument that allows you to force non-numeric values to be NaN, or simply ignore columns containing these values.

Here's an example using a Series of strings s which has the object dtype:

>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0         1
1         2
2       4.7
3    pandas
4        10
dtype: object

The default behaviour is to raise if it can't convert a value. In this case, it can't cope with the string 'pandas':

>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string

Rather than fail, we might want 'pandas' to be considered a missing/bad numeric value. We can coerce invalid values to NaN as follows using the errors keyword argument:

>>> pd.to_numeric(s, errors='coerce')
0     1.0
1     2.0
2     4.7
3     NaN
4    10.0
dtype: float64

The third option for errors is just to ignore the operation if an invalid value is encountered:

>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched

This last option is particularly useful for converting your entire DataFrame, but don't know which of our columns can be converted reliably to a numeric type. In that case, just write:

df.apply(pd.to_numeric, errors='ignore')

The function will be applied to each column of the DataFrame. Columns that can be converted to a numeric type will be converted, while columns that cannot (e.g. they contain non-digit strings or dates) will be left alone.

Downcasting

By default, conversion with to_numeric() will give you either an int64 or float64 dtype (or whatever integer width is native to your platform).

That's usually what you want, but what if you wanted to save some memory and use a more compact dtype, like float32, or int8?

to_numeric() gives you the option to downcast to either 'integer', 'signed', 'unsigned', 'float'. Here's an example for a simple series s of integer type:

>>> s = pd.Series([1, 2, -7])
>>> s
0    1
1    2
2   -7
dtype: int64

Downcasting to 'integer' uses the smallest possible integer that can hold the values:

>>> pd.to_numeric(s, downcast='integer')
0    1
1    2
2   -7
dtype: int8

Downcasting to 'float' similarly picks a smaller than normal floating type:

>>> pd.to_numeric(s, downcast='float')
0    1.0
1    2.0
2   -7.0
dtype: float32

2. astype()

The astype() method enables you to be explicit about the dtype you want your DataFrame or Series to have. It's very versatile in that you can try and go from one type to any other.

Basic usage

Just pick a type: you can use a NumPy dtype (e.g. np.int16), some Python types (e.g. bool), or pandas-specific types (like the categorical dtype).

Call the method on the object you want to convert and astype() will try and convert it for you:

# convert all DataFrame columns to the int64 dtype
df = df.astype(int)

# convert column "a" to int64 dtype and "b" to complex type
df = df.astype({"a": int, "b": complex})

# convert Series to float16 type
s = s.astype(np.float16)

# convert Series to Python strings
s = s.astype(str)

# convert Series to categorical type - see docs for more details
s = s.astype('category')

Notice I said "try" - if astype() does not know how to convert a value in the Series or DataFrame, it will raise an error. For example, if you have a NaN or inf value you'll get an error trying to convert it to an integer.

As of pandas 0.20.0, this error can be suppressed by passing errors='ignore'. Your original object will be returned untouched.

Be careful

astype() is powerful, but it will sometimes convert values "incorrectly". For example:

>>> s = pd.Series([1, 2, -7])
>>> s
0    1
1    2
2   -7
dtype: int64

These are small integers, so how about converting to an unsigned 8-bit type to save memory?

>>> s.astype(np.uint8)
0      1
1      2
2    249
dtype: uint8

The conversion worked, but the -7 was wrapped round to become 249 (i.e. 28 - 7)!

Trying to downcast using pd.to_numeric(s, downcast='unsigned') instead could help prevent this error.


3. infer_objects()

Version 0.21.0 of pandas introduced the method infer_objects() for converting columns of a DataFrame that have an object datatype to a more specific type (soft conversions).

For example, here's a DataFrame with two columns of object type. One holds actual integers and the other holds strings representing integers:

>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a    object
b    object
dtype: object

Using infer_objects(), you can change the type of column 'a' to int64:

>>> df = df.infer_objects()
>>> df.dtypes
a     int64
b    object
dtype: object

Column 'b' has been left alone since its values were strings, not integers. If you wanted to force both columns to an integer type, you could use df.astype(int) instead.


4. convert_dtypes()

Version 1.0 and above includes a method convert_dtypes() to convert Series and DataFrame columns to the best possible dtype that supports the pd.NA missing value.

Here "best possible" means the type most suited to hold the values. For example, this a pandas integer type, if all of the values are integers (or missing values): an object column of Python integer objects are converted to Int64, a column of NumPy int32 values, will become the pandas dtype Int32.

With our object DataFrame df, we get the following result:

>>> df.convert_dtypes().dtypes                                             
a     Int64
b    string
dtype: object

Since column 'a' held integer values, it was converted to the Int64 type (which is capable of holding missing values, unlike int64).

Column 'b' contained string objects, so was changed to pandas' string dtype.

By default, this method will infer the type from object values in each column. We can change this by passing infer_objects=False:

>>> df.convert_dtypes(infer_objects=False).dtypes                          
a    object
b    string
dtype: object

Now column 'a' remained an object column: pandas knows it can be described as an 'integer' column (internally it ran infer_dtype) but didn't infer exactly what dtype of integer it should have so did not convert it. Column 'b' was again converted to 'string' dtype as it was recognised as holding 'string' values.

2 of 16
553

Use this:

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df

Out[16]:
  one  two three
0   a  1.2   4.2
1   b   70  0.03
2   x    5     0

df.dtypes

Out[17]:
one      object
two      object
three    object

df[['two', 'three']] = df[['two', 'three']].astype(float)

df.dtypes

Out[19]:
one       object
two      float64
three    float64
🌐
Pandas
pandas.pydata.org › docs › reference › api › pandas.DataFrame.astype.html
pandas.DataFrame.astype — pandas 3.0.6 documentation
Use a str, numpy.dtype, pandas.ExtensionDtype or Python type to cast entire pandas object to the same type. Alternatively, use a mapping, e.g. {col: dtype, …}, where col is a column label and dtype is a numpy.dtype or Python type to cast one or more of the DataFrame’s columns to column-specific types. ... This keyword is now ignored; changing its value will have no impact on the method.
Discussions

How do you guys handle pandas and its sh*tty data type inference
I feel like y'all need to learn how to read docs, you can (and should) specify your schema beforehand, which you can do by setting dtype param on read_csv to a dictionary in the form of "column_name": pandas_type. Docs More on reddit.com
🌐 r/Python
105
55
April 14, 2023
NaN to int
No, NaN is a floating point value. More on reddit.com
🌐 r/learnpython
16
4
February 1, 2023
How to convert a pandas column from strings to int
>>> df col 0 7 Average 1 6 Low Average 2 8 Good 3 11 Excellent 4 9 Better 5 5 Fair 6 10 Very Good 7 12 Luxury 8 4 Low 9 3 Poor 10 13 Mansion >>> df['col'] = df['col'].str.split(n=1, expand=True)[0].astype(int) >>> df col 0 7 1 6 2 8 3 11 4 9 5 5 6 10 7 12 8 4 9 3 10 13 More on reddit.com
🌐 r/learnpython
4
2
July 22, 2022
Pandas dataframe columns won't convert to float
could you try this , dp03_cleaned[columns] = dp03_cleaned[columns].apply(pd.to_numeric, errors='coerce') More on reddit.com
🌐 r/learnpython
9
0
May 14, 2022
🌐
GeeksforGeeks
geeksforgeeks.org › pandas › change-data-type-for-one-or-more-columns-in-pandas-dataframe
Change Data Type for one or more columns in Pandas Dataframe - GeeksforGeeks
July 11, 2025 - convert_dtypes() method in Pandas automatically converts columns to the most appropriate data type based on the values present.
🌐
Sentry
sentry.io › sentry answers › python › change a column type in a dataframe in python pandas
Change a column type in a DataFrame in Python Pandas
July 3, 2026 - If we want Pandas to decide which data types to use for each column, we should use the convert_dtypes method. Each of these methods is detailed in the subsections below. The first and most versatile method to use is the astype method.
🌐
Seaborn
deeplearningnerds.com › pandas-change-column-types-of-a-dataframe
Pandas - Change Column Types of a DataFrame
March 4, 2024 - Convert the data type of the column "date" from string to datetime. To do this, we use the astype() method, the map() method and the to_datetime() function of Pandas. # Convert string to integer df["users"] = df["users"].astype(int) # Convert ...
🌐
Better Stack
betterstack.com › community › questions › change-column-type-in-pandas
Change Column Type in Pandas | Better Stack Community
import pandas as pd # Sample DataFrame data = {'A': [1, 2, 3], 'B': [4.0, 5.0, 6.0]} df = pd.DataFrame(data) # Original DataFrame print("Original DataFrame:") print(df) # Change column type of column 'A' to float df['A'] = df['A'].astype(float) # Updated DataFrame print("\\nDataFrame with column 'A' converted to float:") print(df)
🌐
Favtutor
favtutor.com › articles › change-column-type-pandas
Change Column Type in Pandas (4 Methods with code)
December 6, 2023 - The DataFrame.astype() method is a convenient method that allows us to cast a Pandas object to a specified data type. It can be used to convert a DataFrame, Series, or Mapping of column name to data type.
Find elsewhere
🌐
Saturn Cloud
saturncloud.io › blog › pandas-tips-change-column-type
How to change column type in Pandas | Saturn Cloud Blog
October 4, 2023 - If you check the data types of the example above after converting all columns, you should see that you now have three int64 columns and one float64 column. One benefit of to_numeric() is built-in error handling, which comes in handy in cases with mixed dtypes. By default, this function raises an error if it encounters a value it can’t convert to numeric. You can change this behavior with the errors parameter: import pandas as pd data = pd.DataFrame({'a': '1 2 3'.split(), 'b': '10 20 chicken'.split()}) #default behavior - raises an error data['b'] = pd.to_numeric(data['b']) #ignore invalid values data['b'] = pd.to_numeric(data['b'], errors = 'ignore') #convert invalid values to NaN data['b'] = pd.to_numeric(data['b'], errors = 'coerce')
🌐
Statology
statology.org › home › how to change column type in pandas (with examples)
How to Change Column Type in Pandas (With Examples)
November 28, 2022 - You can use the following methods with the astype() function to convert columns from one data type to another: ... import pandas as pd #create DataFrame df = pd.DataFrame({'ID': ['1', '2', '3', '4', '5', '6'], 'tenure': [12.443, 15.8, 16.009, ...
🌐
Towards Data Science
towardsdatascience.com › home › latest › how to change column type in pandas dataframes
How To Change Column Type in Pandas DataFrames | Towards Data Science
January 20, 2025 - Before start discussing the various options you can use to change the type of certain column(s), let's first create a dummy DataFrame that we'll use as an example throughout the article. ... df = pd.DataFrame( [ ('1', 1, 'hi'), ('2', 2, 'bye'), ('3', 3, 'hello'), ('4', 4, 'goodbye'), ], columns=list('ABC')) ... The [DataFrame.astype()](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.astype.html) method is used to cast a pandas column to the specified dtype.
🌐
Medium
medium.com › @filip.sekan › 3-ways-how-to-update-data-type-of-columns-in-pandas-97ddb5f32ae4
3 ways how to update data type of columns in Pandas | by Filip Sekan | Medium
February 3, 2023 - In this example, the data type of both the ‘age’ and ‘salary’ columns has been changed to ‘float64’. The pd.to_numeric() method is part of the Pandas library and is used to convert a column in a Pandas data frame from one data type ...
🌐
Spark By {Examples}
sparkbyexamples.com › home › pandas › different ways to change data type in pandas
Different Ways to Change Data Type in Pandas - Spark By {Examples} %
March 27, 2024 - While working in Pandas DataFrame or any table-like data structures we are often required to change the data type(dtype) of a column also called type
🌐
Squash
squash.io › how-to-change-column-type-in-pandas
How to Change Column Type in Pandas - Squash Labs
The easiest way to change the data type of a column in Pandas is by using the astype() method. This method allows you to specify the new data type using a string representation.
🌐
GeeksforGeeks
geeksforgeeks.org › pandas › pandas-change-datatype
Pandas Change Datatype - GeeksforGeeks
July 23, 2025 - import pandas as pd data = {'Name': ['John', 'Alice', 'Bob', 'Eve', 'Charlie'], 'Age': [25, 30, 22, 35, 28], 'Gender': ['Male', 'Female', 'Male', 'Female', 'Male'], 'Salary': [50000, 55000, 40000, 70000, 48000]} df = pd.DataFrame(data) # Convert 'Age' column to float type df['Age'] = df['Age'].astype(float) print(df.dtypes)
🌐
Vultr Docs
docs.vultr.com › python › third party › pandas › dataframe › astype()
Python Pandas DataFrame astype() - Change Data Type
December 24, 2024 - astype() function is used to cast a pandas object to a specified dtype. It comes in handy when you need to make explicit data type conversions. Start with a simple DataFrame. Convert the data type of one or more columns using astype().
🌐
Python Examples
pythonexamples.org › how-to-change-datatype-of-columns-in-pandas-dataframe
How to Change Datatype of Columns in Pandas DataFrame?
we are interested only in the first argument dtype. dtype is data type, or dict of column name -> data type. So, let us use astype() method with dtype argument to change datatype of one or more columns of DataFrame. Let us first start with changing datatype of just one column.
🌐
LinkedIn
linkedin.com › pulse › change-data-type-columns-pandas-mohit-sharma
Change the data type of columns in Pandas
February 8, 2021 - infer_objects() - a utility method to convert object columns holding Python objects to a pandas type if possible. Read on for more detailed explanations and usage of each of these methods. The best way to convert one or more columns of a DataFrame to numeric values is to use pandas.to_numeric(). This function will try to change non-numeric objects (such as strings) into integers or floating-point numbers as appropriate.
🌐
Python Guides
pythonguides.com › change-datatype-of-column-pandas
How to Change Data Type of Column in Pandas
April 21, 2026 - When I am dealing with large DataFrames, I prefer not to write a new line for every single column conversion. Using a dictionary with astype() is much cleaner and easier to maintain in a professional codebase. import pandas as pd # Data representing retail store inventory in Chicago inventory_data = { 'Store_ID': [101, 102, 103], 'Product': ['Laptop', 'Monitor', 'Keyboard'], 'Price': ['1200.50', '300.00', '45.99'], 'Quantity': ['15', '40', '100'] } df = pd.DataFrame(inventory_data) # Using a dictionary to change multiple types at once df = df.astype({ 'Price': float, 'Quantity': int }) print(df.dtypes)
🌐
YouTube
youtube.com › saturn cloud
How to Change Column Types in Pandas - YouTube
Changing a column’s data type is often a necessary step in the data-cleaning process. There are several options for changing types in pandas - which to use, ...
Published: February 15, 2023
Views: 650
🌐
Intellipaat
intellipaat.com › home › blog › how to change column data types in pandas?
How to Change Column Data Types in a DataFrame in Pandas?
October 17, 2025 - There are various methods to change the data type of a single column in a DataFrame using Pandas. You can use the .astype() function of Python to change the data type to any other specific data type. There is the pd.to_numeric() function to ...