3.5 数据转换与规整化 3.5 数据转换与规整化 数据转换与规整化是数据清洗与预处理流程中至关重要的一环,它涉及将数据从一种形式转换为另一种形式,并使其符合分析或建模的要求。这一步骤旨在解决数据中的不一致性、冗余、缺失以及其他可能影响数据质量的问题。 3.5.1 数据转换 数据转换指的是改变数据的表示形式或结构。常见的转换操作包括: 数据类型转换:将数据从一种类型(如字符串)转换为另一种类型(如数值)。 字符串操作:对字符串进行拆分、连接、替换等操作。 日期时间转换:将字符串转换为日期时间格式,或提取日期时间的特定部分。 数值缩放:将数值数据缩放到一个特定的范围,如 0 到 1。 类别变量编码:将类别变量转换为数值表示,如 one-hot 编码或标签编码。 3.5.1.
数据转换与规整化是数据清洗与预处理流程中至关重要的一环,它涉及将数据从一种形式转换为另一种形式,并使其符合分析或建模的要求。这一步骤旨在解决数据中的不一致性、冗余、缺失以及其他可能影响数据质量的问题。
数据转换指的是改变数据的表示形式或结构。常见的转换操作包括:
数据类型转换:将数据从一种类型(如字符串)转换为另一种类型(如数值)。
字符串操作:对字符串进行拆分、连接、替换等操作。
日期时间转换:将字符串转换为日期时间格式,或提取日期时间的特定部分。
数值缩放:将数值数据缩放到一个特定的范围,如 0 到 1。
类别变量编码:将类别变量转换为数值表示,如 one-hot 编码或标签编码。
Pandas 提供了 astype() 方法用于数据类型转换。
import pandas as pd # 创建一个包含字符串的 Series s = pd.Series(['1', '2', '3']) # 将字符串转换为整数 s_int = s.astype(int) print(s_int) print(s_int.dtype) # 将字符串转换为浮点数 s_float = s.astype(float) print(s_float) print(s_float.dtype)
Pandas 提供了 str 属性,允许对 Series 中的字符串进行各种操作。
# 创建一个包含字符串的 Series s = pd.Series([' apple ', 'banana,orange', 'grape']) # 去除字符串两端的空格 s_stripped = s.str.strip() print(s_stripped) # 将字符串转换为小写 s_lower = s.str.lower() print(s_lower) # 分割字符串 s_split = s.str.split(',') print(s_split) # 替换字符串 s_replace = s.str.replace('banana', 'kiwi') print(s_replace)
Pandas 提供了 to_datetime() 函数用于将字符串转换为日期时间格式。
# 创建一个包含日期字符串的 Series s = pd.Series(['2023-10-26', '2023/10/27', 'Oct 28, 2023']) # 将字符串转换为日期时间格式 s_datetime = pd.to_datetime(s) print(s_datetime) # 提取年份 years = s_datetime.dt.year print(years) # 提取月份 months = s_datetime.dt.month print(months) # 提取日 days = s_datetime.dt.day print(days)
常见的数值缩放方法包括:
Min-Max 缩放:将数据缩放到 0 到 1 的范围。
Z-score 标准化:将数据转换为均值为 0,标准差为 1 的分布。
import numpy as np from sklearn.preprocessing import MinMaxScaler, StandardScaler # 创建一个包含数值的 Series s = pd.Series([1, 2, 3, 4, 5]) # Min-Max 缩放 scaler = MinMaxScaler() s_scaled = scaler.fit_transform(s.values.reshape(-1, 1)) print(s_scaled) # Z-score 标准化 scaler = StandardScaler() s_standardized = scaler.fit_transform(s.values.reshape(-1, 1)) print(s_standardized)
常见的类别变量编码方法包括:
One-Hot 编码:为每个类别创建一个新的列,如果样本属于该类别,则该列的值为 1,否则为 0。
标签编码:将每个类别分配一个唯一的整数。
from sklearn.preprocessing import OneHotEncoder, LabelEncoder # 创建一个包含类别变量的 Series s = pd.Series(['apple', 'banana', 'apple', 'orange']) # One-Hot 编码 encoder = OneHotEncoder(sparse_output=False) s_onehot = encoder.fit_transform(s.values.reshape(-1, 1)) print(s_onehot) # 标签编码 encoder = LabelEncoder() s_labeled = encoder.fit_transform(s) print(s_labeled)
数据规整化指的是使数据符合某种规范或标准。常见的规整化操作包括:
数据合并:将多个数据集组合成一个。
数据重塑:改变数据的结构,如将长格式数据转换为宽格式数据。
数据聚合:对数据进行分组并计算统计指标。
数据过滤:根据条件筛选数据。
Pandas 提供了 concat()、merge() 和 join() 函数用于数据合并。
# 创建两个 DataFrame df1 = pd.DataFrame({'id': [1, 2, 3], 'name': ['apple', 'banana', 'orange']}) df2 = pd.DataFrame({'id': [2, 3, 4], 'price': [1.0, 1.5, 2.0]}) # 使用 concat() 函数按行合并 df_concat = pd.concat([df1, df2], ignore_index=True) print(df_concat) # 使用 merge() 函数按 id 列合并 df_merge = pd.merge(df1, df2, on='id', how='inner') print(df_merge) # 使用 join() 函数按索引合并 df_join = df1.set_index('id').join(df2.set_index('id'), how='inner') print(df_join)
Pandas 提供了 pivot()、stack() 和 unstack() 函数用于数据重塑。
# 创建一个 DataFrame df = pd.DataFrame({ 'date': ['2023-10-26', '2023-10-26', '2023-10-27', '2023-10-27'], 'fruit': ['apple', 'banana', 'apple', 'banana'], 'price': [1.0, 1.5, 1.2, 1.7] }) # 使用 pivot() 函数将长格式数据转换为宽格式数据 df_pivot = df.pivot(index='date', columns='fruit', values='price') print(df_pivot) # 创建一个 MultiIndex Series s = df.set_index(['date', 'fruit'])['price'] # 使用 unstack() 函数将 Series 转换为 DataFrame df_unstack = s.unstack() print(df_unstack) # 使用 stack() 函数将 DataFrame 转换为 Series s_stack = df_unstack.stack() print(s_stack)
Pandas 提供了 groupby() 方法用于数据聚合。
# 创建一个 DataFrame df = pd.DataFrame({ 'fruit': ['apple', 'banana', 'apple', 'banana', 'orange'], 'price': [1.0, 1.5, 1.2, 1.7, 2.0], 'quantity': [10, 5, 12, 8, 3] }) # 按 fruit 列分组并计算平均价格 df_grouped = df.groupby('fruit')['price'].mean() print(df_grouped) # 按 fruit 列分组并计算总数量 df_grouped = df.groupby('fruit')['quantity'].sum() print(df_grouped) # 按 fruit 列分组并计算多个统计指标 df_grouped = df.groupby('fruit').agg({'price': 'mean', 'quantity': 'sum'}) print(df_grouped)
Pandas 提供了多种方法用于数据过滤,如布尔索引和 query() 方法。
# 创建一个 DataFrame df = pd.DataFrame({ 'fruit': ['apple', 'banana', 'apple', 'banana', 'orange'], 'price': [1.0, 1.5, 1.2, 1.7, 2.0], 'quantity': [10, 5, 12, 8, 3] }) # 使用布尔索引过滤价格大于 1.5 的数据 df_filtered = df[df['price'] > 1.5] print(df_filtered) # 使用 query() 方法过滤数量小于 10 的数据 df_filtered = df.query('quantity < 10') print(df_filtered)
数据转换与规整化是数据清洗与预处理流程中不可或缺的一部分。通过灵活运用 Pandas 提供的各种函数和方法,我们可以有效地处理数据中的不一致性、冗余和缺失等问题,从而提高数据质量,为后续的分析和建模奠定坚实的基础。
希望以上内容能够帮助你理解 Pandas 中数据转换与规整化的相关知识。