pandas astype coerce 详解
在数据处理和分析中,经常需要对数据的类型进行转换,以满足数据处理或模型输入的需求。Pandas 提供了强大的数据类型转换功能,其中 astype
方法是进行数据类型转换的常用方法之一。本文将详细介绍 astype
方法中的 coerce
参数的使用,以及如何通过它处理数据类型转换中的错误。
1. astype
方法概述
astype
方法用于转换 pandas 对象(如 Series 或 DataFrame)中的数据类型。基本语法如下:
DataFrame.astype(dtype, copy=True, errors='raise')
dtype
:可以是 Python 类型、NumPy 类型或者字典,指定要转换的目标类型。copy
:是否创建原数据的副本。errors
:错误处理策略,默认为 ‘raise’,表示转换错误时抛出异常。另外两个可选值为 ‘ignore’ 和 ‘coerce’。
2. 错误处理参数 errors
在使用 astype
方法时,errors
参数控制着当转换失败时的行为:
raise
:默认值,当转换失败时抛出异常。ignore
:忽略转换错误,保留原始数据。coerce
:将转换错误设置为 NaN。
下面通过示例详细介绍 coerce
的使用。
3. 使用 coerce
处理转换错误
当我们希望将无法转换的数据标记为缺失值(NaN)而不是抛出错误时,可以使用 coerce
选项。这在清洗数据时特别有用,可以帮助我们识别数据中的异常值。
示例代码
示例 1:基本使用
import pandas as pd
import numpy as np
data = {'col1': ['1', '2', 'three', '4', 'pandasdataframe.com']}
df = pd.DataFrame(data)
df['col1'] = df['col1'].astype(float, errors='coerce')
print(df)
示例 2:多列转换
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'float64'}, errors='coerce')
print(df)
示例 3:与字典结合使用
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'datetime64'}, errors='coerce')
print(df)
示例 4:处理非数值列
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['apple', 'banana', 'cherry', 'date', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df['col2'] = df['col2'].astype('category', errors='coerce')
print(df)
示例 5:转换失败时填充默认值
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'float64'}, errors='coerce').fillna(0)
print(df)
更多示例
接下来,我们将继续提供更多使用 coerce
的示例代码,以展示其在不同场景下的应用。
示例 6:整体转换 DataFrame
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype(float, errors='coerce')
print(df)
示例 7:使用字典进行选择性转换
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'float64', 'col3': 'datetime64'}, errors='coerce')
print(df)
示例 8:转换并处理特定列
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df['col3'] = df['col3'].astype('datetime64', errors='coerce')
print(df)
示例 9:转换时忽略错误
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype(float, errors='ignore')
print(df)
Output:
示例 10:混合数据类型
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'float64', 'col3': 'datetime64'}, errors='coerce')
print(df)
以上示例展示了如何使用 coerce
在 pandas 中处理数据类型转换的错误,将无法转换的值设置为 NaN,从而避免数据处理过程中的中断。这种方法特别适用于数据清洗和预处理阶段,可以有效地识别和处理数据中的异常值。
示例 11:转换包含混合类型的列
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df['col1'] = df['col1'].astype(float, errors='coerce')
print(df)
示例 12:转换时间数据
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df['col2'] = df['col2'].astype('datetime64', errors='coerce')
print(df)
示例 13:转换并填充缺失值
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'float64'}, errors='coerce').fillna(-1)
print(df)
示例 14:转换多个列并处理异常
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'float64', 'col3': 'datetime64'}, errors='coerce')
print(df)
示例 15:转换包含特殊字符的数据列
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df['col3'] = df['col3'].astype('datetime64', errors='coerce')
print(df)
示例 16:转换时使用不同的错误处理策略
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'float64', 'col3': 'datetime64'}, errors='ignore')
print(df)
Output:
示例 17:处理具有不同数据类型的 DataFrame
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'float64', 'col3': 'datetime64'}, errors='coerce')
print(df)
示例 18:转换时显式指定数据类型
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype({'col1': np.float64, 'col2': np.float64, 'col3': np.datetime64}, errors='coerce')
print(df)
示例 19:转换包含混合数据类型的列
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df['col1'] = df['col1'].astype(float, errors='coerce')
print(df)
示例 20:转换并处理包含特殊字符的数据
import pandas as pd
import numpy as np
data = {
'col1': ['1', '2', 'three', '4', 'pandasdataframe.com'],
'col2': ['1.1', '2.2', 'three', '4.4', 'pandasdataframe.com'],
'col3': ['2021-01-01', '2022-02-02', 'pandasdataframe.com', '2023-03-03', '2024-04-04']
}
df = pd.DataFrame(data)
df = df.astype({'col1': 'float64', 'col2': 'float64', 'col3': 'datetime64'}, errors='coerce')
print(df)
以上示例展示了如何在不同的数据处理场景中使用 coerce
选项来安全地处理数据类型转换,确保数据的整洁性和一致性。通过这些示例,我们可以看到 coerce
在数据预处理和清洗中的重要作用,它帮助我们避免了因数据类型不匹配而导致的程序错误,提高了数据处理的效率和可靠性。