【Python茴香豆系列】之 PANDAS 如何遍历 DataFrame 的所有行
【Python茴香豆系列】之 PANDAS 如何遍历 DataFrame 的所有行
用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情。这让我想起鲁迅笔下的孔乙己。孔乙己对于茴香豆的茴字的四种写法颇有研究。我不敢自比孔乙己,这里搜集一些 Python 的茴香豆,以飨各位码农。
首先准备一个函数,用来生成用于测试的 DataFrame 。这个 DataFrame 有 3 列,名称分别为 a 、 b 和 c 。
>>> import numpy as np
>>> import pandas as pd
>>>
>>> df = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]})
>>> dfa b c
0 1 4 7
1 2 5 8
2 3 6 9
BOSS 的要求是把每一行的 a , b 打印出来,例如:
1 4
2 5
3 6
茴香豆一: iterrows
DataFrame 有一个函数,专门就是用来遍历所有的行的:
>>> for index, row in df.iterrows():
>>> print(row['a'], row['b'])
1 4
2 5
3 6
这个函数简单明了,似乎不错,但是有一个致命的弱点:一般情况下会比较慢,
在行数较多的情况下,那个什么,会怀疑人生。
茴香豆二: itertuples
iterrows 有一个兄弟 itertuples ,可以把 DataFrame 变成 namedtuples ,这样速度上就更快了。
>>> for row in df.itertuples(index=True, name='hxd'):
>>> print(row.a, row.b)
1 4
2 5
3 6
当然金无足赤,在使用的时候也有要注意的地方,最主要的是当 DataFrame 的列名称有 Python 保留字的时候,列名会被自动转变,例如:
>>> df = pd.DataFrame({'in':[1,2,33], 'b':[4,5,6], 'c':[7,8,9]})
>>> for row in df.itertuples(name='hxd'):
>>> print(row)
hxd(Index=0, _1=1, b=4, c=7)
hxd(Index=1, _1=2, b=5, c=8)
hxd(Index=2, _1=33, b=6, c=9)
这个例子中, in
是 Python 的保留字,被自动变更为 _1
。
茴香豆三: iloc
这个有点,嗯,大拙若巧吧。
>>> for i in range(0, len(df)):
>>> print (df.iloc[i]['a'], df.iloc[i]['b'])
1 4
2 5
3 6
茴香豆四: to_***
DataFrame 有很多 to_
开头的函数,通过这些函数可以把 DataFrame 转换成其他形式,然后再加以
处理,这样就可以衍生出许许多多的方法,例如:
>>> for row in df.to_dict(orient='records'):
>>> print(row['a'], row['b'])
当然, DataFrame 还有各种各样的 to_ 开头的方法,有兴趣的朋友可以尝试一下。
茴香豆五: 不遍历
其实对于 BOSS 的要求,有时候我们要学会说不。当然如何说不,是一门手艺,不在本文的范围之内。
如果只是要显示 DataFrame 的内容,那么如下的方式就足够了:
>>> print(df[['a', 'b']].to_string(index=False, header=False))
1 4
2 5
3 6
如果要对每一行数据进行计算,那么应当使用 Pandas 提供的函数或者运算方法,而不是去遍历每一行数据。
这是因为 Pandas 的函数是向量化的,其处理效率远高于遍历。示例如下:
df = pd.DataFrame(np.random.randn(100000, 4), columns=list('abcd'))
timeit [row.a + row.b for row in df.itertuples(index=False)]
72 ms ± 1.01 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
timeit [x+y for x,y in zip(df['a'], df['b'])]
20.3 ms ± 132 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
timeit df['a'] + df['b']
1.27 ms ± 83.2 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
从以上示例可以看出,遍历是最慢的,列表推导其次, pandas 自带的是最快的。
其实道理也很简单,专业的事交给专业的人去做,不要作。
【Python茴香豆系列】之 PANDAS 如何遍历 DataFrame 的所有行相关推荐
- 【Python茴香豆系列】之 PANDAS 修改 DataFrame 列名
[Python茴香豆系列]之 PANDAS 修改 DataFrame 列名 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴 ...
- 【Python茴香豆系列】之 PANDAS 获取 DataFrame 的行数
[Python茴香豆系列]之 PANDAS 获取 DataFrame 的行数 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于 ...
- 【Python茴香豆系列】之 拍扁列表
[Python茴香豆系列]之 拍扁列表 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢 ...
- 【Python茴香豆系列】之 字典合并
[Python茴香豆系列]之 字典合并 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢 ...
- python dataframe遍历_在pandas中遍历DataFrame行的实现方法
有如下 Pandas DataFrame: import pandas as pd inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,' ...
- 在pandas中遍历DataFrame行
有如下 Pandas DataFrame: import pandas as pd inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,' ...
- 【Python茴香豆系列】之 PANDAS 如何根据列的值来选取 DataFrame 的行
用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢自比孔乙己,这里搜集一些 Python ...
- 【Python茴香豆系列】之 PANDAS 变更列的类型
用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢自比孔乙己,这里搜集一些 Python ...
- python数据分析系列教程——Pandas全解
分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 起步 Pandas最初被作为金融数据分析工具而开发出来,因此 pandas 为时间序列分析提 ...
最新文章
- Linux那些事儿 之 戏说USB(18)设备的生命线(一)
- android onresume时view,android – 在使用ViewPager滑动时,Fragment不会调用OnResume()
- Spring常问的面试
- C# 谈谈Interface和通过Interface传递web页面数据
- surface php老是用不了,surface pro7触摸屏没反应怎么办
- java跑批任务_【spring配置】——spring整合Quartz定时器
- 卷积神经网络在tenserflow的实现
- H3C 模拟器 pc与防火墙,交换机相连,在pc cmd下用telnet访问交换机和防火墙
- java比较两个时间年月份的大小
- 解决MarkDown打开出现:awesomium web-brower framework This view has crashed
- 解决ThinkServer TS250中网卡在centos6.5中没有安装驱动(驱动安装)
- Python数据可视化三部曲之 Pyecharts 从上手到上头
- python怎么输入下一行_python中怎么换行,怎么从第一行换到第二行的?
- REMIX编译DeclarationError: Identifier already declared
- 拉格朗日乘子和KTT条件
- java验证身份证合法性_Java安全性,第2部分:身份验证和授权
- 【邻接矩阵乘法】沼泽鳄鱼
- arXiv镜像加载慢的解决办法
- h5调用Android 的方法
- 蓝牙技术|了解蓝牙LE Audio的Auracast广播音频
热门文章
- 4、配置虚拟局域网技术
- 阿里云-邮件推送 java 代码 ,测试邮件推送服务,阿里云邮件推送,java
- Linux环境—JPEG/JPG/PNG图片转换WEBP格式(二)
- 光纤压力传感器FOP-M在矿井测量气压应用
- win7 笔记本开启虚拟WiFi
- 使用林地可行性报告现状图要包含的内容清单
- 关于JavaScript中的Date你需要知道的一切
- 平板的android版本是5.0.2,安卓5.0平板诺基亚N1迎来第二个更新
- 美国工业物联网初创公司Serious Integrated获得500万美元A轮融资
- Java第三方登录(QQ,微博,微信)