lambda与pd.Series()

125 阅读2分钟
  1. 问题概述
    • 初始问题是如何将形如"600 ~ 1200"的字符串数据分割并提取其中的最小值和最大值。
  2. 解决方案
    • 方法一:使用pd.Series([min_val, max_val], index=['min', 'max'])
      • 这种方法在apply方法中定义了一个函数,该函数将每个范围字符串拆分成最小值和最大值,并将其返回为一个Pandas Series对象。
      • 然后将这个Series对象拼接到原始的DataFrame中,完成数据处理。
# 假设这些值以字符串形式保存在一个列表中
values = [
    '600 ~ 1200',
    '600 ~ 1200',
    '10 ~ 20',
    '20 ~ 40',
    '80 ~ 150',
    '20 ~ 40',
    '300 ~ 600',
    '10 ~ 20',
    '150 ~ 300'
]

import pandas as pd

# 定义一个函数,用于将字符串分割并计算最大值和最小值
def min_max_from_string(s):
    min_val, max_val = map(int, s.split(' ~ '))
    return pd.Series([min_val, max_val], index=['min', 'max'])

# 将values转换为DataFrame
df = pd.DataFrame(values, columns=['range'])

# 应用函数并将结果拼接到原DataFrame
df[['min', 'max']] = df['range'].apply(min_max_from_string)

print(df)

  • 方法二:使用lambda函数
    • 这种方法直接在apply方法中使用lambda函数来处理每行的范围字符串。
    • lambda函数通过字符串的split方法将范围分割成最小值和最大值,并直接赋值给DataFrame的新列。
import pandas as pd

# 假设这些值以字符串形式保存在一个列表中
values = [
    '600 ~ 1200',
    '600 ~ 1200',
    '10 ~ 20',
    '20 ~ 40',
    '80 ~ 150',
    '20 ~ 40',
    '300 ~ 600',
    '10 ~ 20',
    '150 ~ 300'
]

# 将values转换为DataFrame
df = pd.DataFrame(values, columns=['range'])

# 使用lambda函数处理每行的范围字符串,不需要显式创建Series对象
df[['min', 'max']] = df['range'].apply(lambda x: pd.Series([int(val) for val in x.split(' ~ ')]))

print(df)

  1. 效率比较

    • 就处理效率而言,lambda函数的方法可能稍微更快一些,因为它避免了额外创建Pandas Series对象的开销。
    • 性能上的差异通常是微小的,主要取决于数据规模和具体的运行环境。
  2. 总结知识点

    • 使用Python中的Pandas库处理数据,特别是使用apply方法对每行数据进行自定义处理。
    • 比较和选择不同方法时,需要考虑代码的简洁性、可读性以及可能的性能影响。
    • lambda函数在简单数据转换任务中通常更为适用和直接。