100个pandas apply (lambda)实战技巧。

在pandas的数据处理工具箱里,apply(lambda)堪称最灵活的函数之一。这个能沿DataFrame/Series轴批量执行自定义逻辑的工具,既可以对单个元素进行平方、大小写转换等基础操作,也能胜任跨行多列乘积、滚动统计等复杂运算。

本文整理了100个真实场景下的应用案例,从元素级转换到特征工程全流程,带你通过具体代码掌握apply(lambda)的核心用法,解锁pandas数据处理的高效实践。

1.对列中的每个元素求平方:

df['column'].apply(lambda x: x**2)

2.计算列中每个字符串的长度:

df['text_column'].apply(len)

3.将字符串转换为大写:

df['text_column'].apply(lambda x: x.upper())

4.检查值是否大于阈值:

df['numeric_column'].apply(lambda x: '高于阈值' if x > 10 else '低于阈值')

5.从文本列中提取第一个单词:

df['text_column'].apply(lambda x: x.split()[0])

6.计算每行的平均值:

df.apply(lambda row: row.mean(), axis=1)

7.计算每列中缺失值的数量:

df.apply(lambda x: x.isnull().sum())

8.计算列的累积和:

df['numeric_column'].apply(lambda x: x.cumsum())

9.对列中的每个元素应用自定义函数:

def custom_function(x):
    # 这里是你的自定义逻辑
    return result

df['column'].apply(custom_function)

10.将负值替换为零:

df['numeric_column'].apply(lambda x: max(0, x))

11.从列中的每个字符串提取最后两个字符:

df['text_column'].apply(lambda x: x[-2:])

12.检查列中每个字符串是否存在子字符串:

df['text_column'].apply(lambda x: '子字符串存在' if '子字符串' in x else '无子字符串')

13.计算两列的乘积:

df.apply(lambda row: row['col1'] * row['col2'], axis=1)

14.将时间戳转换为月份:

df['timestamp_column'].apply(lambda x: x.month)

15.计算列中每个值的指数:

df['numeric_column'].apply(lambda x: math.exp(x))

16.检查值是偶数还是奇数:

df['numeric_column'].apply(lambda x: '偶数' if x % 2 == 0 else '奇数')

17.计算列的累积乘积:

df['numeric_column'].apply(lambda x: x.cumprod())

18.从电子邮件地址中提取域名:

df['email_column'].apply(lambda x: x.split('@')[1])

19.根据映射字典替换值:

mapping = {'A': '苹果', 'B': '香蕉'}
df['letter_column'].apply(lambda x: mapping.get(x, x))

20.计算列的滚动平均值:

df['numeric_column'].apply(lambda x: x.rolling(window=3).mean())

21.检查值是否为质数:

df['numeric_column'].apply(lambda x: all(x % i != 0 for i in range(2, int(x**0.5) + 1)) and x > 1)

22.从字符串中提取数字:

df['text_column'].apply(lambda x: ''.join(filter(str.isdigit, x)))

23.将值归一化到0和1之间:

df['numeric_column'].apply(lambda x: (x - df['numeric_column'].min()) / (df['numeric_column'].max() - df['numeric_column'].min()))

24.检查字符串是否包含任何元音:

df['text_column'].apply(lambda x: any(char.lower() in 'aeiou' for char in x))

25.计算每行绝对值的和:

df.apply(lambda row: row.abs().sum(), axis=1)

26.检查列是否仅包含唯一值:

df['column'].apply(lambda x: '全部唯一' if x.nunique() == len(x) else '存在重复')

27.将字符串列转换为单词列表:

df['text_column'].apply(lambda x: x.split())

28.计算列的滚动标准差:

df['numeric_column'].apply(lambda x: x.rolling(window=3).std())

29.检查日期是周末还是工作日:

df['date_column'].apply(lambda x: '周末' if x.weekday() in [5, 6] else '工作日')

30.去除字符串的前导和尾随空格:

df['text_column'].apply(lambda x: x.strip())

31.将列转换为分类类型:

df['category_column'].apply(lambda x: pd.Categorical(x))

32.计算每行平方值的和:

df.apply(lambda row: (row**2).sum(), axis=1)

33.检查列是否包含任何空值:

df['column'].apply(lambda x: '包含空值' if x.isnull().any() else '无空值')

34.将日期列转换为星期几:

df['date_column'].apply(lambda x: x.strftime('%A'))

35.计算列的百分比变化:

df['numeric_column'].apply(lambda x: x.pct_change())

36.计算每个字符串中的单词数:

df['text_column'].apply(lambda x: len(x.split()))

37.将时间戳列转换为特定时区:

df['timestamp_column'].apply(lambda x: x.tz_localize('UTC').tz_convert('America/New_York'))

38.检查列是否包含任何非数值值:

df['numeric_column'].apply(lambda x: '包含非数值' if any(not pd.api.types.is_numeric_dtype(val) for val in x) else '仅数值')

39.从日期列中提取年份:

df['date_column'].apply(lambda x: x.year)

40.计算列中每个值的z分数:

df['numeric_column'].apply(lambda x: (x - df['numeric_column'].mean()) / df['numeric_column'].std())

41.将字符串列转换为标题大小写:

df['text_column'].apply(lambda x: x.title())

42.检查列是否单调递增:

df['numeric_column'].apply(lambda x: x.is_monotonic_increasing)

43.计算列的移动平均值:

df['numeric_column'].apply(lambda x: x.rolling(window=3).mean())

44.检查列是否包含任何空白字符:

df['text_column'].apply(lambda x: '包含空白' if any(char.isspace() for char in x) else '无空白')

45.计算列中每个值的阶乘:

df['numeric_column'].apply(lambda x: math.factorial(x))

46.检查列是否包含任何特殊字符:

df['text_column'].apply(lambda x: '包含特殊字符' if any(not char.isalnum() for char in x) else '无特殊字符')

47.将列转换为日期时间格式:

df['date_column'].apply(pd.to_datetime)

48.检查列是否包含任何异常值:

df['numeric_column'].apply(lambda x: '存在异常值' if any((x - x.mean()).abs() > 3 * x.std()) else '无异常值')

49.计算两列的加权平均值:

df.apply(lambda row: row['value_column'] * 0.7 + row['weight_column'] * 0.3, axis=1)

50.检查列是否包含任何重复值:

df['column'].apply(lambda x: '包含重复' if x.duplicated().any() else '无重复')

51.计算列中出现次数的累积计数:

df['category_column'].apply(lambda x: x.groupby(x).cumcount() + 1)

52.检查列是否包含任何负值:

df['numeric_column'].apply(lambda x: '包含负值' if (x < 0).any() else '无负值')

53.将秒数列转换为小时:

df['seconds_column'].apply(lambda x: x / 3600)

54.检查列是否包含任何前导零:

df['numeric_column'].apply(lambda x: '包含前导零' if any(str(val).startswith('0') for val in x) else '无前导零')

55.计算列的中位数绝对偏差(MAD):

df['numeric_column'].apply(lambda x: np.median(np.abs(x - np.median(x))))

56.将数值列转换为二进制表示:

df['numeric_column'].apply(lambda x: bin(x)[2:])

57.检查列是否包含任何重复模式:

df['text_column'].apply(lambda x: '重复模式' if any(x[i:i+3] == x[i+3:i+6] for i in range(len(x)-5)) else '无重复模式')

58.计算每列的偏度:

df.apply(lambda x: x.skew())

59.检查列是否包含任何非字母数字字符:

df['text_column'].apply(lambda x: '包含非字母数字' if any(not char.isalnum() for char in x) else '仅字母数字')

60.计算具有指定窗口的列的滚动和:

df['numeric_column'].apply(lambda x: x.rolling(window=3).sum())

61.检查列是否包含任何高于动态计算阈值的值:

threshold = df['numeric_column'].mean() + 2 * df['numeric_column'].std()
df['numeric_column'].apply(lambda x: '高于阈值' if x > threshold else '低于阈值')

62.计算每列中缺失值的百分比:

df.apply(lambda x: (x.isnull().sum() / len(df)) * 100)

63.检查列是否包含任何回文字符串:

df['text_column'].apply(lambda x: '回文' if x == x[::-1] else '非回文')

64.从时间戳列中提取小时:

df['timestamp_column'].apply(lambda x: x.hour)

65.检查列是否包含任何2的幂值:

df['numeric_column'].apply(lambda x: '2的幂' if math.log2(x).is_integer() else '非2的幂')

66.计算每行的几何平均值:

df.apply(lambda row: scipy.stats.gmean(row.dropna()), axis=1)

67.检查列是否包含任何具有指定前缀的字符串:

prefix = 'ABC'
df['text_column'].apply(lambda x: x.startswith(prefix))

68.将十六进制字符串列转换为十进制整数:

df['hex_column'].apply(lambda x: int(x, 16))

69.检查列是否包含任何5的倍数的值:

df['numeric_column'].apply(lambda x: '5的倍数' if x % 5 == 0 else '非5的倍数')

70.计算每列的四分位距(IQR):

df.apply(lambda x: scipy.stats.iqr(x))

71.检查列是否包含任何在指定范围内的值:

min_range, max_range = 10, 20
df['numeric_column'].apply(lambda x: '在范围内' if min_range <= x <= max_range else '在范围外')

72.计算两列之间的余弦相似度:

from scipy.spatial.distance import cosine
df.apply(lambda row: 1 - cosine(row['col1'], row['col2']), axis=1)

73.检查列是否包含任何具有特定后缀的字符串:

suffix = '_end'
df['text_column'].apply(lambda x: x.endswith(suffix))

74.将以秒为单位的持续时间列转换为分钟:

df['duration_column'].apply(lambda x: x / 60)

75.检查列是否包含任何质数:

df['numeric_column'].apply(lambda x: '质数' if all(x % i != 0 for i in range(2, int(x**0.5) + 1)) and x > 1 else '非质数')

76.计算两列之间的滚动相关性:

df[['col1', 'col2']].apply(lambda x: x['col1'].rolling(window=3).corr(x['col2']))

77.检查列是否包含任何在特定位置具有特定子字符串的值:

substring, position = 'abc', 2
df['text_column'].apply(lambda x: '包含子字符串' if x[position:position + len(substring)] == substring else '不包含子字符串')

78.将布尔列转换为整数(0或1):

df['bool_column'].apply(lambda x: int(x))

79.检查列是否包含任何同时是3和5的倍数的值:

df['numeric_column'].apply(lambda x: '3和5的倍数' if x % 3 == 0 and x % 5 == 0 else '非3和5的倍数')

80.使用指定的权重计算列的加权和:

weights = {'col1': 0.3, 'col2': 0.7}
df.apply(lambda row: sum(row[col] * weights[col] for col in weights.keys()), axis=1)

81.检查列是否包含任何连续重复的值:

df['text_column'].apply(lambda x: '连续重复' if any(x[i] == x[i+1] for i in range(len(x)-1)) else '无连续重复')

82.计算具有指定窗口的列的滚动最大值:

df['numeric_column'].apply(lambda x: x.rolling(window=3).max())

83.检查列是否包含任何偶数且大于10的值:

df['numeric_column'].apply(lambda x: '偶数且>10' if x % 2 == 0 and x > 10 else '非偶数或<=10')

84.将字符串列转换为小写:

df['text_column'].apply(lambda x: x.lower())

85.检查列是否包含任何具有特定单词的值:

word = 'apple'
df['text_column'].apply(lambda x: '包含单词' if word in x.lower() else '不包含单词')

86.计算具有指定窗口的列的滚动最小值:

df['numeric_column'].apply(lambda x: x.rolling(window=3).min())

87.检查列是否包含任何完全平方数的值:

df['numeric_column'].apply(lambda x: '完全平方数' if math.sqrt(x).is_integer() else '非完全平方数')

88.计算具有指定窗口的列的滚动中位数:

df['numeric_column'].apply(lambda x: x.rolling(window=3).median())

89.检查列是否包含任何符合特定正则表达式模式的值:

import re
pattern = r'^[A-Z]\d{3}$'
df['text_column'].apply(lambda x: '匹配模式' if re.match(pattern, x) else '不匹配模式')

90.计算具有指定窗口的列的滚动分位数:

df['numeric_column'].apply(lambda x: x.rolling(window=3).quantile(0.5))

91.检查列是否包含任何是3或5的倍数的值:

df['numeric_column'].apply(lambda x: '3或5的倍数' if x % 3 == 0 or x % 5 == 0 else '非3或5的倍数')

92.将日期列转换为一年中的第几天:

df['date_column'].apply(lambda x: x.dayofyear)

93.检查列是否包含任何具有特定长度的值:

target_length = 5
df['text_column'].apply(lambda x: '匹配长度' if len(x) == target_length else '不同长度')

94.计算具有指定窗口的列的滚动标准差:

df['numeric_column'].apply(lambda x: x.rolling(window=3).std())

95.检查列是否包含任何给定除数的倍数的值:

divisor = 7
df['numeric_column'].apply(lambda x: '7的倍数' if x % divisor == 0 else '非7的倍数')

96.将时间差列转换为小时:

df['timedelta_column'].apply(lambda x: x.total_seconds() / 3600)

97.检查列是否包含任何具有特定字符数的值:

target_count = 8
df['text_column'].apply(lambda x: '匹配计数' if len(x) == target_count else '不同计数')

98.计算具有指定窗口的列中平方值的滚动和:

df['numeric_column'].apply(lambda x: (x**2).rolling(window=3).sum())

99.检查列是否包含任何斐波那契数的值:

def is_fibonacci(n):
    fib_list = [0, 1]
    while fib_list[-1] < n:
        fib_list.append(fib_list[-1] + fib_list[-2])
    return n in fib_list

df['numeric_column'].apply(lambda x: '斐波那契数' if is_fibonacci(x) else '非斐波那契数')

100.计算具有指定窗口的列中绝对值的滚动和:

df['numeric_column'].apply(lambda x: x.abs().rolling(window=3).sum())



Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐