【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 的所有行相关推荐

  1. 【Python茴香豆系列】之 PANDAS 修改 DataFrame 列名

    [Python茴香豆系列]之 PANDAS 修改 DataFrame 列名 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴 ...

  2. 【Python茴香豆系列】之 PANDAS 获取 DataFrame 的行数

    [Python茴香豆系列]之 PANDAS 获取 DataFrame 的行数 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于 ...

  3. 【Python茴香豆系列】之 拍扁列表

    [Python茴香豆系列]之 拍扁列表 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢 ...

  4. 【Python茴香豆系列】之 字典合并

    [Python茴香豆系列]之 字典合并 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢 ...

  5. python dataframe遍历_在pandas中遍历DataFrame行的实现方法

    有如下 Pandas DataFrame: import pandas as pd inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,' ...

  6. 在pandas中遍历DataFrame行

    有如下 Pandas DataFrame: import pandas as pd inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,' ...

  7. 【Python茴香豆系列】之 PANDAS 如何根据列的值来选取 DataFrame 的行

    用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢自比孔乙己,这里搜集一些 Python ...

  8. 【Python茴香豆系列】之 PANDAS 变更列的类型

    用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴香豆的茴字的四种写法颇有研究.我不敢自比孔乙己,这里搜集一些 Python ...

  9. python数据分析系列教程——Pandas全解

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 起步 Pandas最初被作为金融数据分析工具而开发出来,因此 pandas 为时间序列分析提 ...

最新文章

  1. Linux那些事儿 之 戏说USB(18)设备的生命线(一)
  2. android onresume时view,android – 在使用ViewPager滑动时,Fragment不会调用OnResume()
  3. Spring常问的面试
  4. C# 谈谈Interface和通过Interface传递web页面数据
  5. surface php老是用不了,surface pro7触摸屏没反应怎么办
  6. java跑批任务_【spring配置】——spring整合Quartz定时器
  7. 卷积神经网络在tenserflow的实现
  8. H3C 模拟器 pc与防火墙,交换机相连,在pc cmd下用telnet访问交换机和防火墙
  9. java比较两个时间年月份的大小
  10. 解决MarkDown打开出现:awesomium web-brower framework This view has crashed
  11. 解决ThinkServer TS250中网卡在centos6.5中没有安装驱动(驱动安装)
  12. Python数据可视化三部曲之 Pyecharts 从上手到上头
  13. python怎么输入下一行_python中怎么换行,怎么从第一行换到第二行的?
  14. REMIX编译DeclarationError: Identifier already declared
  15. 拉格朗日乘子和KTT条件
  16. java验证身份证合法性_Java安全性,第2部分:身份验证和授权
  17. 【邻接矩阵乘法】沼泽鳄鱼
  18. arXiv镜像加载慢的解决办法
  19. h5调用Android 的方法
  20. 蓝牙技术|了解蓝牙LE Audio的Auracast广播音频

热门文章

  1. 4、配置虚拟局域网技术
  2. 阿里云-邮件推送 java 代码 ,测试邮件推送服务,阿里云邮件推送,java
  3. Linux环境—JPEG/JPG/PNG图片转换WEBP格式(二)
  4. 光纤压力传感器FOP-M在矿井测量气压应用
  5. win7 笔记本开启虚拟WiFi
  6. 使用林地可行性报告现状图要包含的内容清单
  7. 关于JavaScript中的Date你需要知道的一切
  8. 平板的android版本是5.0.2,安卓5.0平板诺基亚N1迎来第二个更新
  9. 美国工业物联网初创公司Serious Integrated获得500万美元A轮融资
  10. Java第三方登录(QQ,微博,微信)