Pandas:无需遍历行,按分组条件更新Validated列值
无需遍历实现DataFrame的Validated列更新
完全可以不用遍历每一行,借助Pandas的分组(groupby)和transform方法就能高效实现需求,核心思路是先按指定列分组,判断每组是否存在正值,再批量更新列值。
实现代码
import pandas as pd # 构造你提供的示例DataFrame data = { 'State': ['Arizona', 'Alabama', 'Arkansas', 'Kentuky', 'Ohio', 'Alabama', 'Arizona', 'California', 'California', 'Arkansas', 'Ohio', 'California'], 'ColorName': ['Yellow', 'Orange', 'Red', 'Green', 'Blue', 'Orange', 'Yellow', 'Blue', 'Blue', 'Red', 'Yellow', 'Blue'], 'Code': ['A', 'A', 'B', 'M', 'X', 'A', 'A', 'C', 'C', 'B', 'X', 'C'], 'Value': [50, 150, -500, -40, 100, -30, 100, 100, -100, 500, 100, 100], 'Validated': [''] * 12 } df = pd.DataFrame(data) # 核心逻辑:分组判断每组是否存在正值,批量更新Validated列 # 生成与原DataFrame同长度的布尔序列,标记每组是否有正值 has_positive = df.groupby(['State', 'ColorName', 'Code'])['Value'].transform(lambda x: (x > 0).any()) # 对无正值的组,将Validated设为"Invalid" df['Validated'] = df['Validated'].mask(~has_positive, 'Invalid') print(df)
代码说明
groupby(['State', 'ColorName', 'Code']):按你指定的三列对数据分组,把相同组合的行归为一组transform(lambda x: (x > 0).any()):对每组计算是否存在Value>0的行,返回和原DataFrame行数一致的布尔序列,保证每行都能对应到所在组的判断结果mask(~has_positive, 'Invalid'):当布尔值为False(即组内无任何正值)时,将该行的Validated列替换为"Invalid",其余行保持原有值(这里是空字符串)
运行后,只有Kentuky-Green-M这一组因为没有正值,对应的行Validated会被设为"Invalid",其余组均保持空值。
内容的提问来源于stack exchange,提问作者Ishit Vyas
相关产品推荐
相关产品推荐

