Pandas嵌套IF生成Mark列遇异常:Duration=10.0时返回None求解决
问题原因分析
你遇到的10.0对应Mark为None的问题,是因为条件判断漏掉了等于10的情况:
当Duration(Mins)等于10.0时,它既不满足<10的条件,也不满足>10的条件,函数没有进入任何一个返回分支,因此默认返回None。
修复方案
方案1:修改判断逻辑
调整mark函数的最后一个条件,把>改为>=,或者单独添加等于10的分支:
import pandas as pd data = { 'Alarm Name': ['Cell Down', '4G Down', '3G Down', '2G Down', 'Cell Unavailable', 'Partial Down', 'Signalling Down'], 'Duration(Mins)': [3, 5.9, 10.1, 2.9, -12, 6, 10] } df = pd.DataFrame(data) def mark(row): if row['Duration(Mins)'] >= 0: if row['Duration(Mins)'] < 3: return '0-3 Mins' elif row['Duration(Mins)'] < 6: return '3-6 Mins' elif row['Duration(Mins)'] < 10: return '6-10 Mins' elif row['Duration(Mins)'] >= 10: # 修正此处条件 return '>10 Mins' else: return 'Open' df['Mark'] = df.apply(mark, axis=1)
方案2:用Pandas原生函数pd.cut更高效
apply方法处理大型数据集时效率偏低,推荐用Pandas内置的pd.cut函数直接实现分箱逻辑,代码更简洁且性能更好:
import pandas as pd data = { 'Alarm Name': ['Cell Down', '4G Down', '3G Down', '2G Down', 'Cell Unavailable', 'Partial Down', 'Signalling Down'], 'Duration(Mins)': [3, 5.9, 10.1, 2.9, -12, 6, 10] } df = pd.DataFrame(data) # 定义分箱边界和对应标签 bins = [-float('inf'), 0, 3, 6, 10, float('inf')] labels = ['Open', '0-3 Mins', '3-6 Mins', '6-10 Mins', '>10 Mins'] # 使用cut生成Mark列 df['Mark'] = pd.cut(df['Duration(Mins)'], bins=bins, labels=labels, include_lowest=True)
这样处理后,10.0会被分到>10 Mins区间,负数自动对应Open,完全无需嵌套if逻辑。
内容的提问来源于stack exchange,提问作者Bihaqi Al Rafik
相关产品推荐
相关产品推荐

