修改现有列中的信息是数据准备中一项常见工作。你可能需要根据当前值进行计算、标准化文本格式、更改数据类型,或者执行自定义转换。Pandas为此提供了多种灵活的方法。直接赋值与向量化操作修改列的最简单方式通常是通过直接的算术或逻辑运算。由于 Pandas 构建于 NumPy 之上,这些运算通常是向量化的,这意味着它们会逐元素高效地执行,无需显式循环。例如,假设你有一个 DataFrame,其中包含摄氏度温度,你想将它们转换为华氏度。import pandas as pd import numpy as np # 示例 DataFrame data = {'City': ['London', 'Paris', 'Tokyo'], 'Temp_C': [12, 15, 8]} df = pd.DataFrame(data) print("原始 DataFrame:") print(df) # 在新列中将 'Temp_C' 列转换为华氏度 df['Temp_F'] = df['Temp_C'] * 9/5 + 32 print("\n已添加华氏度列的 DataFrame:") print(df) # 或者,覆盖原始列(请谨慎使用) # df['Temp_C'] = df['Temp_C'] * 9/5 + 32 # df = df.rename(columns={'Temp_C': 'Temp_F'}) # 如果覆盖,则重命名这种向量化方式适用于加法(+)、减法(-)、乘法(*)、除法(/)、幂运算(**)以及其他标准数学运算。使用 apply() 方法执行自定义函数有时,你需要的转换比简单的算术更复杂。你可能有一个自定义函数,想将其执行到列(Pandas Series)中的每个元素。apply() 方法在此处很有用。假设我们想将温度归类为'Cold'(冷)、'Mild'(温和)或'Warm'(暖)。# 定义一个函数来分类温度 def categorize_temp(temp): if temp < 10: return 'Cold' elif 10 <= temp < 20: return 'Mild' else: return 'Warm' # 将此函数执行到 'Temp_C' 列 df['Temp_Category'] = df['Temp_C'].apply(categorize_temp) print("\n带有温度类别的 DataFrame:") print(df)你也可以将 apply() 与 lambda 函数结合使用,进行更简洁的一次性任务:# 示例:使用 lambda 函数计算温度的平方 df['Temp_C_Squared'] = df['Temp_C'].apply(lambda x: x**2) print("\n带有温度平方的 DataFrame:") print(df)apply() 方法很灵活,但如果存在针对你任务的向量化操作或更专门的函数,有时它的速度会比这些方法慢。使用 replace() 替换值如果你需要替换列中的特定值,replace() 方法会非常实用。你可以替换单个值,或提供一个字典来同时替换多个值。# 带有分类数据的示例 DataFrame data_cat = {'ID': [101, 102, 103, 104], 'Grade': ['A', 'B', 'C', 'B'], 'Status': ['Pass', 'Pass', 'Fail', 'Pass']} df_cat = pd.DataFrame(data_cat) print("原始分类 DataFrame:") print(df_cat) # 在 'Status' 列中将 'Fail' 替换为 'Did Not Pass' df_cat['Status'] = df_cat['Status'].replace('Fail', 'Did Not Pass') print("\n替换 'Fail' 后的 DataFrame:") print(df_cat) # 使用字典替换多个等级 grade_map = {'A': 'Excellent', 'B': 'Good', 'C': 'Fair'} df_cat['Grade_Desc'] = df_cat['Grade'].replace(grade_map) print("\n替换多个等级后的 DataFrame:") print(df_cat)使用 map() 进行值替换与 replace() 相似,Series 上的 map() 方法可以用来根据字典(或另一个 Series,或一个函数)替换每个值。当你希望根据预设的对应关系将所有现有值映射到新值时,它会特别有用。在映射字典中找不到的值将变为 $NaN$。# 示例 Series s = pd.Series(['cat', 'dog', 'rabbit', 'cat']) print("原始 Series:") print(s) # 将动物名称映射到声音 animal_sounds = {'cat': 'meow', 'dog': 'bark'} sounds = s.map(animal_sounds) print("\n映射后的 Series(未知值变为 NaN):") print(sounds)replace() 针对要更改的个别值,而 map() 常用于基于查找的全面转换。使用 .str 进行字符串操作Pandas 通过包含字符串(对象 dtype)的 Series 上的 .str 访问器,提供了一套强大的字符串处理方法。这让你能轻松地对整个列执行向量化的常见字符串操作。# 带有文本数据的示例 DataFrame data_text = {'Product': ['Apple iPhone 14', 'SAMSUNG GALAXY S23', 'google pixel 7'], 'Code': ['APL-14', 'SAM-S23', 'GGL-PX7']} df_text = pd.DataFrame(data_text) print("原始文本 DataFrame:") print(df_text) # 将 'Product' 名称转换为小写 df_text['Product_Lower'] = df_text['Product'].str.lower() # 将 'Code' 分割成 'Brand' 和 'Model' df_text[['Brand_Code', 'Model_Code']] = df_text['Code'].str.split('-', expand=True) # 检查 'Product' 是否包含 'galaxy' (不区分大小写) df_text['Has_Galaxy'] = df_text['Product'].str.contains('GALAXY', case=False) print("\n字符串操作后的 DataFrame:") print(df_text)其他常见的 .str 方法包括 startswith()、endswith()、replace()、len()、strip()、get() 等等。它们在清理和标准化文本数据方面非常实用。使用 astype() 更改列数据类型有时,数据加载时的数据类型不正确。例如,数字可能被读取为字符串(对象类型),或者在处理缺失值后你可能想将浮点数转换为整数。astype() 方法可以更改列的数据类型。# 带有混合类型的示例 DataFrame data_types = {'ID': ['101', '102', '103'], 'Value': [20.5, 15.0, 33.8], 'Category': ['X', 'Y', 'X']} df_types = pd.DataFrame(data_types) print("带有数据类型的原始 DataFrame:") print(df_types) print(df_types.dtypes) # 将 'ID' 从对象(字符串)转换为整数 df_types['ID'] = df_types['ID'].astype(int) # 将 'Value' 从浮点数转换为整数(截断小数部分) df_types['Value_Int'] = df_types['Value'].astype(int) # 将 'Category' 转换为更节省内存的 'category' 数据类型 df_types['Category'] = df_types['Category'].astype('category') print("\n更改数据类型后的 DataFrame:") print(df_types) print(df_types.dtypes)更改类型时请务必小心。如果转换不可行(例如,尝试将 'hello' 这样的字符串转换为整数),Pandas 将引发错误。在使用 astype() 之前,请确认你的数据适合目标类型。对于涉及潜在错误或缺失值的转换,你可能需要先整理数据,或使用像 pd.to_numeric(errors='coerce') 这样的函数,它会将无法转换的值变为 $NaN$。修改现有列是数据整理的核心部分。通过结合直接操作、apply()、replace()、字符串方法和类型转换,你可以很好地调整数据,使其符合分析所需的格式。