【pandas】-4- 索新增列,assign,applay,map使用

【pandas】-1-读取数据
【pandas】-2-数据查询
【pandas】-3-Pandas 索引

4. Pandas 索新增列,assign,applay,map使用

在 Pandas 中,有多种方式可以新增数据列。我将展示最常用的几种方法,并通过一个示例演示它们的应用。

常用新增列方法

  1. 直接赋值 - 最常用的方式
  2. 使用 assign() 方法 - 函数式编程风格,返回新 DataFrame
  3. 使用 apply() 方法 - 基于函数计算新列
  4. 使用 insert() 方法 - 在指定位置插入列
  5. 使用条件逻辑 - np.where() 或 np.select(),注意np 是numpy

示例

python 复制代码
import pandas as pd
import numpy as np

# 创建示例数据
df = pd.DataFrame({
    'A': range(1, 6),
    'B': range(10, 15),
    'C': ['p', 'q', 'r', 's', 't']
})
print("原始数据:")
print(df)

# 各种新增列的方法
# 1. 直接赋值(最常用)
df['D'] = df['A'] + df['B']
df['E'] = df['C'].str.upper()

# 2. 使用assign()方法
df = df.assign(F=lambda x: x['A'] * 2)

# 3. 使用apply()方法
df['G'] = df.apply(lambda row: row['A'] + row['B'] if row['A'] > 2 else row['A'], axis=1)

# 4. 使用insert()方法在指定位置插入
df.insert(2, 'H', [100, 200, 300, 400, 500])

# 5. 使用条件逻辑
df['I'] = np.where(df['A'] > 3, 'high', 'low')

print("\n新增列后的数据:")
print(df)

# 各列说明
print("\n列说明:")
print("D = A + B")
print("E = C的大写形式")
print("F = A * 2 (使用assign创建)")
print("G = 条件计算: A>2时A+B,否则A")
print("H = 在位置2插入的固定值")
print("I = 条件判断: A>3时为'high',否则'low'")

最常用的方法

在实际工作中,最常用的新增列方法是:

  1. 直接赋值 - 简单直观,适用于大多数场景
  2. assign()方法 - 适合函数式编程和链式操作
  3. 条件逻辑(np.where) - 用于基于条件的列创建

直接赋值是最简单高效的方式,适用于大多数情况。assign()方法在需要保持原DataFrame不变或进行链式操作时非常有用。条件逻辑则常用于数据分箱和分类变量的创建。

你可以运行上述代码查看各种方法的效果,并根据自己的需求选择最适合的方式。

assign

主要特点

  1. 不修改原 DataFrame:返回一个新的 DataFrame
  2. 支持链式操作 :可以连续调用多个 assign()
  3. 支持 lambda 函数:可以使用 lambda 表达式引用其他列

优点与适用场景

  1. 函数式编程:适合在数据处理的管道操作中使用
  2. 代码可读性:链式操作使代码更加清晰
  3. 不修改原数据:避免意外修改原始数据

注意事项

  1. assign() 返回的是新 DataFrame,原始 DataFrame 不会被修改
  2. 如果需要在原 DataFrame 上修改,需要将结果赋值回原变量
  3. 在同一 assign() 调用中,后面定义的列可以引用前面定义的列

assign() 方法是 Pandas 函数式编程风格的重要组成部分,特别适合在数据清洗和转换的管道操作中使用。

applay()

python 复制代码
import pandas as pd
import numpy as np

# 创建示例数据
df = pd.DataFrame({
    'A': range(1, 6),
    'B': range(10, 15),
    'C': ['p', 'q', 'r', 's', 't']
})

print("原始数据:")
print(df)

# 对 Series 的每个元素应用函数
df['A_squared'] = df['A'].apply(lambda x: x**2)
print("\nA列的平方:")
print(df['A_squared'])
print("--------------------------")
# 使用自定义函数
def categorize_value(x):
    if x > 3:
        return 'High'
    elif x > 1:
        return 'Medium'
    else:
        return 'Low'

df['A_category'] = df['A'].apply(categorize_value)
print("\nA列的分类:")
print(df['A_category'])
print("--------------------------")
# 创建包含缺失值的数据
df_with_nan = pd.DataFrame({
    'A': [1, 2, np.nan, 4, 5],
    'B': [10, np.nan, 30, 40, 50],
    'C': ['p', 'q', 'r', 's', 't']
})

# 使用 apply 处理缺失值
df_with_nan['A_filled'] = df_with_nan['A'].apply(
    lambda x: 0 if pd.isna(x) else x
)
print("\n处理缺失值后的A列:")
print(df_with_nan['A_filled'])

性能考虑

虽然 apply() 非常灵活,但它的性能通常不如 Pandas 的内置向量化操作。对于大型数据集,应该优先考虑使用向量化操作,只有在必要时才使用 apply()。

与相关方法的比较

  1. apply() vs map() :
    • apply() 可以用于 DataFrame 和 Series
    • map() 只能用于 Series,对每个元素应用函数
  2. apply() vs applymap() :
    • apply() 沿着轴应用函数
    • applymap() 对 DataFrame 的每个元素应用函数
  3. apply() vs transform() :
    • apply() 可以返回聚合结果或转换后的数据
    • transform() 总是返回与原始数据相同形状的结果

特点:

  1. 尽量使用 Pandas 的内置向量化操作,它们通常比 apply() 更快
  2. 当需要复杂逻辑时,使用 apply() 配合自定义函数
  3. 对于简单的元素级操作,考虑使用 map() 或向量化操作
  4. 使用 axis 参数明确指定是处理行还是列

apply() 方法是 Pandas 中非常强大的工具,特别适合处理需要自定义逻辑的复杂数据转换任务。通过合理使用,可以大大增强数据处理的灵活性和能力。

map 方法

python 复制代码
import pandas as pd
import numpy as np

# 创建数值型 Series
s_numeric = pd.Series([1, 2, 3, 4, 5])
print("\n数值型 Series:")
print(s_numeric)


# 创建映射 Series
mapping_series = pd.Series(['small', 'medium', 'large'], index=[1, 2, 3])
print("\n映射 Series:")
print(mapping_series)

# 使用 Series 进行映射
s_mapped_series = s_numeric.map(mapping_series)
print("\n使用 Series 映射后的结果:")
print(s_mapped_series)
print("---------------------------")

# 创建包含缺失值的数据
s_with_nan = pd.Series([1, 2, np.nan, 4, 5])
print("\n包含缺失值的 Series:")
print(s_with_nan)

# 默认情况下,map 会处理 NaN 值
s_mapped_nan = s_with_nan.map(lambda x: x*2 if pd.notna(x) else np.nan)
print("\n处理 NaN 后的结果:")
print(s_mapped_nan)

# 使用 na_action='ignore' 参数
s_ignore_nan = s_with_nan.map(lambda x: x*2, na_action='ignore')
print("\n使用 na_action='ignore' 后的结果:")
print(s_ignore_nan)

与相关方法的比较

  1. map() vs apply() :
    • map() 只能用于 Series,对每个元素应用函数或映射
    • apply() 可以用于 DataFrame 和 Series,功能更强大
  2. map() vs replace() :
    • map() 主要用于值转换和映射
    • replace() 主要用于值替换,支持更复杂的替换模式
  3. map() vs applymap() :
    • map() 用于 Series
    • applymap() 用于 DataFrame,对每个元素应用函数

性能考虑

  • map() 通常比 apply() 更快,因为它专门为 Series 优化
  • 对于简单的值映射,使用字典的 map() 操作非常高效
  • 对于复杂转换,可能需要使用 apply()

特点

  1. 对于简单的值映射,优先使用字典 + map()
  2. 对于元素级转换,使用 map() 配合 lambda 函数或命名函数
  3. 处理缺失值时,考虑使用 na_action 参数
  4. 当需要基于多个列进行计算时,使用 apply() 而不是 map()

map() 方法是 Pandas 中非常高效和实用的工具,特别适合进行值映射和简单的元素级转换。通过合理使用,可以大大提高数据清洗和转换的效率。

相关推荐
benchmark_cc4 小时前
A股、港股、美股日K如何拼接?处理不同交易日造成的时间轴错位
大数据·python·pandas·量化交易·股票数据·quantdash
2601_9669496521 小时前
多市场量化策略的数据接口应该如何设计:从数据层架构到策略接入
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
benchmark_cc2 天前
本地已有一年历史 K 线,第二天更新别只拉“昨天一天”
python·数据分析·pandas·量化交易·股票数据·quantdash
正在走向自律4 天前
AI数据分析与可视化:从基础到应用实践
服务器·人工智能·python·机器学习·数据分析·pandas
ctlover4 天前
Pandas进阶
人工智能·机器学习·pandas
程序员清风4 天前
数据类型转换与日期时间处理
数据结构·pandas
for_ever_love__5 天前
Pandas 基础——用 DataFrame 管理训练数据与实验记录
数据分析·pandas·大模型开发·dataframe
benchmark_cc6 天前
A股量化尾盘筛选对数据时效敏感:行情链路变慢时先排查哪里?
python·数据分析·pandas·量化交易·股票数据·quantdash
梅雅达编程笔记6 天前
07-Pandas数据清洗:
pandas·drop_duplicates·dropna·fillna·to_numeric·to_datetime·清洗流程
for_ever_love__6 天前
电商订单数据清洗实战——Pandas 处理缺失值、重复单与异常金额
python·数据分析·pandas·数据清洗