#10 —列表推导式
列表推导是一种用于处理列表的简单单行语法,可让您访问列表的各个元素并对其执行操作。
语法由括号组成,该括号包含类似的表达式 print(plant)
,后跟for
and和orif
子句。
greenhouse = ['boat orchid', 'bird's nest fern', 'dancing-lady orchid',
'nun's hood orchid', 'pennywort', 'snake plant',
'maidenhair fern', 'chinese ground orchid',
'vanilla orchid', 'tiger orchid', 'pothos']
[print(plant) for plant in greenhouse if 'orchid' in plant];
将打印:
代码语言:javascript复制boat orchid
dancing-lady orchid
nun's hood orchid
chinese ground orchid
vanilla orchid
tiger orchid
(注意:列表推导末尾的分号将禁止打印Jupyter Notebook单元格最后一行的输出。这样,Jupyter Notebook不会同时打印列表 None
。)
#9 —单行if语句
与前面的技巧一起,单行if可以帮助您使代码更简洁。
假设我们已经决定对确定植物是否为兰花感兴趣。对于单行-if,我们从测试条件为真时要输出的值开始。
此代码将单行(如果具有列表理解)组合以输出1(其中植物是兰花),否则输出0。
代码语言:javascript复制[1 if 'orchid' in plant else 0 for plant in greenhouse]
将输出:
代码语言:javascript复制[1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0]
这个列表本身并不是那么有趣,但是当与下一个技巧结合使用时,我们将看到单行if的实际用法。
#8 —将lambda应用于DataFrame列
pandas DataFrame是一种可以保存表格数据的结构,例如Excel for Python。 lambda
是关键字,提供了对表中的值执行操作的快捷方式。
假设我们有一个有关温室植物的信息表:
代码语言:javascript复制import pandas as pd
data = pd.DataFrame({'plant': greenhouse,
'height_(cm)': [50, 20, 15, 40, 50,
60, 45, 50, 50, 20, 20],
'condition': ['full sun', 'shade', 'partial sun', 'partial sun', 'partial sun',
'full sun', 'shade', 'partial sun', 'full sun', 'partial sun', 'full sun'],
'water_(cm/week)': [2.5, 4, 2.5, 2.5, 3,
0.5, 4.5, 2.5, 2, 2.5, 2.5],
'music': ['bach', 'bach', 'beyonce', 'bach', 'cardi b',
'nicki', 'bach', 'bach', 'vivaldi', 'cardi b', 'bach']})
打印此DataFrame将显示以下内容:
假设我们想知道某个植物是否更喜欢某个德国古典作曲家。
代码语言:javascript复制data[‘music’].apply(lambda x: 1 if x == ‘bach’ else 0)
将输出:
其中第一列是DataFrame索引,第二列是代表单行if输出的系列。
lambda
代表“匿名函数”。它使我们能够对DataFrame中的值执行操作,而无需创建正式函数-即带有def
and return
语句的函数 ,我们将在稍后介绍。
#7-将条件应用于多列
假设我们要确定哪些喜欢巴赫的植物也需要充足的阳光,因此我们可以将它们放在温室中。
代码语言:javascript复制def sunny_shelf(col1, col2):
return (1 if ((col1 == 'full sun') & (col2 == 'bach')) else 0)
data['new_shelf'] = data.apply(lambda x: sunny_shelf(x.condition, x.music), axis=1)
首先,我们通过使用def
关键字并为其命名并在单词之间加下划线的名称(例如,sunny_shelf)来创建函数 。
函数sunny_shelf接受两个参数作为其输入-用于检查“full sun”的列和用于检查“ bach”的列。函数输出这两个条件是否都成立。
在第4行,我们 将此函数.apply()应用于DataFrame并指定应将哪些列作为参数传递。 axis=1
告诉pandas它应该跨列评估函数(与之相对 axis=0
,后者跨行评估)。我们将.apply()函数的输出分配给名为“ new_shelf”的新DataFrame列。
或者,我们可以将 np.where() 函数用于相同的目的:
代码语言:javascript复制import numpy as np
data['new_shelf'] = np.where( (data['condition'] == 'full sun')
& (data['music'] == 'bach'), 1, 0)
numpy库中的此 函数 检查上面指定的两个条件(即,植物是充满阳光和日耳曼古典音乐的爱好者),并将输出分配给“ new_shelf”列。
#6 —分解一长行代码
顺便说一句,您可以在多行中将括号,方括号或大括号内的任何语句分开,以免单行运行时间过长。初始化温室清单,创建植物数据框并使用np.where()函数时,我们已经看到了这一点。
根据 PEP8,Python样式指南:
包装长行的首选方法是在括号,方括号和花括号内使用Python的隐含行连续性。
#5 —读取.csv并设置索引
假设该表包含一个唯一的植物标识符,我们希望将其用作DataFrame中的索引。我们可以使用index_col参数进行设置。
代码语言:javascript复制data = pd.read_csv('greenhouse.csv', index_col='plant_id')
#4—格式为货币
无论如何,我们在这些植物上花了多少钱?让我们将此计算的输出格式设置为money。
代码语言:javascript复制‘${:,.2f}’.format(data[‘price’].sum())
将输出:
代码语言:javascript复制'$15,883.66'
逗号分隔符使您很容易看到到目前为止我们已经损失了多少现金。
#3-创建数据透视表
接下来,假设我们要查看每个植物物种花费的金额。我们可以使用pd.pivot_table() 或 .groupby()进行聚合 。
代码语言:javascript复制pd.pivot_table(data, index=’plant’, values=’price’, aggfunc=np.sum)
要么
代码语言:javascript复制data[[‘plant’,’price’]].groupby(by=’plant’).sum()
这两种方法都将输出以下内容:
我们还可以使用这两种方法指定多级数据透视表。
代码语言:javascript复制data['orchid'] = data['plant'].apply(lambda x: 1 if 'orchid' in x else 0)
piv = pd.pivot_table(data2, index=['orchid', 'plant'], values='price', aggfunc=np.sum)
piv0 = data[['orchid','plant','price']].groupby(by=['orchid','plant']).sum()
检查 piv.equals(piv0)
产生True。
这是生成的DataFrame的样子:
#2—计算总数的百分比
对每种植物物种如何造成温室总成本感到好奇吗?将每个值除以所有行的总和,然后将该输出分配给名为“ perc”的新列:
代码语言:javascript复制piv['perc'] = piv['price'].div(piv['price'].sum(axis=0))
#1 —按多列排序
最后,让我们对DataFrame进行排序,以使兰花位于顶部,而植物则按降序排列。
代码语言:javascript复制piv.sort_values([‘orchid’,’price’], ascending=False)