趋近智
修改现有列中的信息是数据准备中一项常见工作。你可能需要根据当前值进行计算、标准化文本格式、更改数据类型,或者执行自定义转换。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()、字符串方法和类型转换,你可以很好地调整数据,使其符合分析所需的格式。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造