初学者的10种Python技巧

2020-12-14 11:44:59 浏览数 (1)

#10 —列表推导式

列表推导是一种用于处理列表的简单单行语法,可让您访问列表的各个元素并对其执行操作。

语法由括号组成,该括号包含类似的表达式 print(plant),后跟forand和orif子句。

代码语言:javascript复制
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)


0 人点赞