如何用Lambda函数在Pandas DataFrame中生成均值比较布尔列
解决方法
你的代码存在两个核心问题:一是语法错误(lambda里错误使用了生成器表达式),二是逻辑错误——没有按chems分组比较,而是直接对全表的lot均值做全局判断,完全不符合"每个chems分组内比较"的需求。
以下是正确的实现步骤:
步骤1:计算每个chems分组内两个lot的均值
先按chems分组,分别提取lot=9849和lot=7711的value均值:
import pandas as pd import numpy as np # 示例DataFrame(可替换为你的实际数据) data = { 'chems': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'lot': ['9849', '9849', '7711', '7711', '9849', '9849', '7711', '7711'], 'value': [10, 20, 5, 15, 8, 12, 15, 25] } df = pd.DataFrame(data) # 分组计算两个lot的均值 grouped_means = df.groupby('chems').apply( lambda g: pd.Series({ 'mean_9849': g[g['lot'] == '9849']['value'].mean(), 'mean_7711': g[g['lot'] == '7711']['value'].mean() }) ).reset_index()
步骤2:生成每个chems对应的布尔结果
在分组均值表中添加判断列,得到每个chems的比较结果:
grouped_means['Boolean'] = grouped_means['mean_9849'] > grouped_means['mean_7711'] # 如果需要字符串类型的'True'/'False'而非布尔值,可转类型: # grouped_means['Boolean'] = (grouped_means['mean_9849'] > grouped_means['mean_7711']).astype(str)
步骤3:将结果映射回原DataFrame
通过chems列将分组结果匹配到原表的每一行:
df = df.merge(grouped_means[['chems', 'Boolean']], on='chems', how='left')
简洁版实现
如果追求代码简洁,可以合并步骤:
# 直接生成每个chems的判断结果并映射 df['Boolean'] = df['chems'].map( df.groupby('chems').apply( lambda g: g[g['lot'] == '9849']['value'].mean() > g[g['lot'] == '7711']['value'].mean() ) ).astype(str) # 若不需要字符串可去掉astype(str)
示例输出
运行上述代码后,示例DataFrame的结果为:
| chems | lot | value | Boolean |
|---|---|---|---|
| A | 9849 | 10 | True |
| A | 9849 | 20 | True |
| A | 7711 | 5 | True |
| A | 7711 | 15 | True |
| B | 9849 | 8 | False |
| B | 9849 | 12 | False |
| B | 7711 | 15 | False |
| B | 7711 | 25 | False |
内容的提问来源于stack exchange,提问作者PZA_666
相关产品推荐
相关产品推荐

