【Python】100个pandas使用小技巧,让你精通apply函数
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())更多推荐
所有评论(0)