一些让Python代码简洁的实用技巧总结
作者:Frank Andrade 发布时间:2022-02-06 11:03:25
目录
前言
1. 使用Lambda来修改Pandas数据框中的值
2. 使用f-string来连接字符串
3. 用Zip()函数对多个列表进行迭代
4. 使用列表理解法
5. 对文件对象使用with语句
6. 停止使用方括号来获取字典项, 利用.get()代替
7. 多重赋值
总结
前言
众所周知,编写Python代码在开始时十分容易,但随着你在工具包中添加更多的库,你的脚本可能会有不必要的代码行,变得冗长而混乱。可能短期内能够应付工作,但长期来看,麻烦不小。
在这篇文章中,我将与你分享7个技巧,使你在使用Python进行数据科学时更加简洁。这涵盖了我们日常所做的事情,例如修改Pandas数据框中的值,连接字符串,读取文件等操作!
1. 使用Lambda来修改Pandas数据框中的值
假设我们有以下df数据框:
data = [[1,2,3], [4,5,6], [7,8,9]]
df = pd.DataFrame(data, columns=[0,1,2])
IN[1]: print (df)
OUT[1]: 0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
现在由于某种原因,你需要在第0列的数字上添加01的值。一个常见的方法是定义一个函数来完成这个任务,然后用 apply 函数来修改一列的值。
def add_numbers(x):
return f'{x}01'
df[0] = df[0].apply(add_numbers)
IN[1]: print (df)
OUT[1]: 0 1 2
0 101 2 3
1 401 5 6
2 701 8 9
这并不复杂,但是在数据框中对每一个改变创建一个函数是不切实际的。这时lambda就派上了用场。
lambda函数类似于普通的Python函数,但它可以不使用名称来定义,这使得它成为一个漂亮的单行代码。之前使用的代码可以用以下方式来减少。
df[0] = df[0].apply(lambda x:f'{x}01')
当你不知道是否可以访问一个系列的属性来修改数据时,Lambda变得非常有用。
例如,列0包含字母,我们想把它们大写。
# 如果你知道.str的存在,你可以这样做
df[0] = df[0].str.title()
# 如果你不知道.str,你仍然可以用lambda大写
df[0] = df[0].apply(lambda x: x.title())
2. 使用f-string来连接字符串
字符串连接是Python中非常常见的操作,它可以用不同的方法来完成。最常见的方法是使用+运算符;然而,这个运算符的一个问题是我们不能在字符串之间添加任何分隔符。
当然,如果你想把 "Hello "和 "World "连接起来,一个典型的变通方法是添加一个空白分隔符(" ")。
print("Hello" + " " + "World")
这就完成了工作,但为了写出更可读的代码,我们可以用一个f-string来代替它。
IN[2]: print(f'{Hello} {World}')
OUT[2]: "Hello World"
在一个基本的例子中,这似乎是不必要的,但是当涉及到连接多个值时(正如你将在提示#3中看到的),f-string将使你免于书写多次+ " " +。我不知道过去有多少次不得不写+运算符,但现在不会了!
其他连接字符串的方法是使用join()方法或format()函数,然而f-string在字符串连接方面做得更好。
3. 用Zip()函数对多个列表进行迭代
你是否曾经想在 Python 中循环遍历一个以上的列表?当你有两个列表时,你可以用 enumerate 来实现。
teams = ['Barcelona', 'Bayern Munich', 'Chelsea']
leagues = ['La Liga', 'Bundesliga', 'Premiere League']
for i, team in enumerate(teams):
league = leagues[i]
print(f'{team} plays in {league}')
然而,当你有两个或更多的列表时,这变得不切实际。一个更好的方法是使用zip()函数。zip()函数接收迭代数据,将它们聚集在一个元组中,并返回之。
让我们再增加一个列表,看看zip()的威力!
teams = ['Barcelona', 'Bayern Munich', 'Chelsea']
leagues = ['La Liga', 'Bundesliga', 'Premiere League']
countries = ['Spain', 'Germany', 'UK']
for team, league, country in zip(teams, leagues, countries):
print(f'{team} plays in {league}. Country: {country}')
上述代码的输出结果为:
Barcelona plays in La Liga. Country: Spain
Bayern Munich plays in Bundesliga. Country: Germany
Chelsea plays in Premiere League. Country: UK
此处你注意到我们在这个例子中使用了f-string吗?代码变得更有可读性,不是吗?
4. 使用列表理解法
清洗和处理数据的一个常见步骤是修改现有的列表。比如,我们有以下需要大写的列表:
words = ['california', 'florida', 'texas']
将words列表的每个元素大写的典型方法是创建一个新的大写列表,执行一次 for 循环,使用.title(),然后将每个修改的值附加到新的列表中。
capitalized = []
for word in words:
capitalized.append(word.title())
然而,Pythonic的方法是使用列表理解来做到这一点。列表理解有一种优雅的方法来制作列表。
你可以用一行代码重写上面的for循环:
capitalized = [word.title() for word in words]
由此我们可以跳过第一个例子中的一些步骤,结果是一样的。
5. 对文件对象使用with语句
当在一个项目上工作时,我们经常会对文件进行读写操作。最常见的方法是使用open()函数打开一个文件,它会创建一个我们可以操作的文件对象,然后作为一个习惯的做法,我们应该使用close()关闭该文件对象。
f = open('dataset.txt', 'w')
f.write('new_data')
f.close()
这很容易记住,但有时写了几个小时的代码,我们可能会忘记用f.close()关闭f文件。这时,with语句就派上了用场。with语句将自动关闭文件对象f,形式如下:
with open('dataset.txt', 'w') as f:
f.write('new_data')
有了这个,我们可以保持代码的简短。
你不需要用它来读取CSV文件,因为你可以用pandas的 pd.read_csv()轻松地读取,但在读取其他类型的文件时,这仍然很有用。例如,从pickle文件中读取数据时经常使用它。
import pickle
# 从pickle文件中读取数据集
with open(‘test', ‘rb') as input:
data = pickle.load(input)
6. 停止使用方括号来获取字典项, 利用.get()代替
比如,有以下一个字典:
person = {'name': 'John', 'age': 20}
我们可以通过person[name]和person[age]分别获得姓名和年龄。但是,由于某种原因,我们想获得一个不存在的键,如 "工资",运行person[salary]会引发一个`KeyError'。
这时,get()方法就有用了。如果键在字典中,get()方法返回指定键的值,但是如果没有找到键,Python 将返回None。得益于此,你的代码不会中断。
person = {'name': 'John', 'age': 20}
print('Name: ', person.get('name'))
print('Age: ', person.get('age'))
print('Salary: ', person.get('salary'))
输出结果如下:
Name: John
Age: 20
Salary: None
7. 多重赋值
你是否曾想减少用于创建多个变量、列表或字典的代码行数?那么,你可以用多重赋值轻松做到这一点。
# 原始操作
a = 1
b = 2
c = 3
# 替代操作
a, b, c = 1, 2, 3
# 代替在不同行中创建多个列表
data_1 = []
data_2 = []
data_3 = []
data_4 = []
# 可以在一行中创建它们的多重赋值
data_1, data_2, data_3, data_4 = [], [], [], []
# 或者使用列表理解法
data_1, data_2, data_3, data_4 = [[] for i in range(4)]
原文链接:
https://towardsdatascience.com/7-tips-to-level-up-your-python-code-for-data-science-4a64dbccd86d
来源:https://mp.weixin.qq.com/s/egThaVvcgV_-opocwxWOVA


猜你喜欢
- max找出tensor 的行或者列最大的值:找出每行的最大值:import torchoutputs=torch.FloatTensor([
- 如果 replaceText 为函数,对于每一个匹配的子字符串,调用该函数时带有下面的 m+3 个参数,此处 m 是在 rgExp 中捕获的
- 当你有多个进程或线程访问相同的数据时,竞争条件是一个威胁。本文探讨了在发现竞争条件后如何测试它们。Incrmnt你在一个名为“Incrmnt
- 首先来看一下代码:chars = "abcd"tmp = []for char in chars: tmp.append
- 1、问题描述某厂生产甲乙两种饮料,每百箱甲饮料需用原料6千克、工人10名,获利10万元;每百箱乙饮料需用原料5千克、工人20名,获利9万元。
- 下载此插件 并将其解压后的my_focus文件夹安放在KindEditor插件目录下(KindEditor所在目录/plugins/)如:H
- 本文实例讲述了JavaScript使用math.js进行精确计算操作。分享给大家供大家参考,具体如下:javascript进行浮点运算会有尾
- jQuery的makeArray有其局限性(1.3.4还有bug),我自己实现了一个,不过涉及N多辅助方法。var dom = {},_to
- 这篇文章主要介绍了python智联招聘爬虫并导入到excel代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 同样,对事务日志进行备份也只会截断不活动事务的那部分事务日志,所以打开的事务会导致日志变多(甚至达到物理限制),直到事务被提交或回滚。要找到
- sqlserver安装完之后(安装参考)我遇到了一个尴尬的问题:之前的安装时是windows选择身份验证的,所以用可视化工具连接到服务器是,
- 上篇关于Go模板库应用 的文章最后我们留下一个问题,页面模板是通过 CDN 引用的 BootStrap 的 css , js 文件。到目前位
- 限制访问可以基于某种权限,某些检查或者为login视图提供不同的位置,这些实现方式大致相同。一般的方法是直接在视图的 request.use
- 主要功能在copyFiles()函数里实现,如下:def copyFiles(src, dst): sr
- 本文实例为大家分享了jquery指定精确小数位的具体代码,供大家参考,具体内容如下/*** 将标签的值格式化* id 标签id* min 最
- 多模块引用由此引发的相对路径混乱当不同层级的 Python 模块相互调用时,我们会发现原本在一个模块中写死的相对路径会导致找不到文件的报错。
- Python2.7Mac OS抓取的是电影天堂里面最新电影的页面。链接地址: http://www.dytt8.net/html/gndy/
- 利用over(),将统计信息计算出来,然后直接筛选结果集declare @t table(ProductID int,ProductName
- 如何取得刚添加的记录自动增加的ID字段的号码?我们用下面这个程序就行:rs(1)=oldrname &nb
- 本文借鉴于张广河教授主编的《数据结构》,对其中的代码进行了完善。从某源点到其余各顶点的最短路径Dijkstra算法可用于求解图中某源点到其余