作者|Louis Chan 编译|VK 来源|Towards Data Science
Python可以说是当今最酷的编程语言(多亏了机器学习和数据科学),但与最好的编程语言之一C相比,它的效率并不是很高。
在开发机器学习模型时,很常见的情况是,我们需要根据从统计分析或上一次迭代的结果导出的硬编码规则,然后以编程方式更新。承认这一点并不羞耻:我一直在用Pandas apply编写代码,直到有一天我对嵌套非常厌烦,于是决定研究(又称Google)其他更可维护、更高效的方法
演示数据集
我们将要使用的数据集是iris数据集,你可以通过pandas或seaborn免费获得它。
import pandas as pd
iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
# import seaborn as sns
# iris = sns.load_dataset("iris")
iris数据集的前5行
数据统计信息
假设在初始分析之后,我们希望用以下逻辑标记数据集:
如果萼片长度(sepal length)< 5.1,则标签为0;
否则,如果萼片宽度(sepal width)> 3.3和萼片长度< 5.8,则标签为1;
否则,如果萼片宽度> 3.3,花瓣长度(petal length)> 5.1,则标签为2;
否则,如果萼片宽度> 3.3,花瓣长度< 1.6且萼片长度< 6.4或花瓣宽度< 1.3,则标签3;
否则,如果萼片宽度>3.3且萼片长度< 6.4或花瓣宽度< 1.3,则标签为4;
否则,如果萼片宽度> 3.3,则标签为5;
否则标签6
在深入研究代码之前,让我们快速地将一个新的label列设置为None:
iris['label'] = None
Pandas.iterrows+嵌套If Else块
如果你还在用这个,这篇博文绝对是适合你的地方!
%%timeit
for idx, row in iris.iterrows():
if row['sepal_length'] < 5.1:
iris.loc[idx, 'label'] = 0
elif row['sepal_width'] > 3.3:
if row['sepal_length'] < 5.8:
iris.loc[idx, 'label'] = 1
elif row['petal_length'] > 5.1:
iris.loc[idx, 'label'] = 2
elif (row['sepal_length'] <