DataFrame的遍历方式主要有三种
DataFrame.iterrows() | 按行顺序优先,接着依次按列迭代 |
DataFrame.iteritems() | 按列顺序优先,接着依次按行迭代 |
DataFrame.itertuples() | 按行顺序优先,接着依次按列迭代 |
下图的DataFrame沿用上一篇的示例。
剧名,集數,主演,監製
"風雨晴Come Rain, Come Shine",20,石修、黃日華、苗僑偉、湯鎮業、陳秀珠,
佛山贊先生Kung Fu Master of Fat Shan,20,呂良偉、黃日華、歐陽佩珊,
飛鷹The Hawk,20,鄭少秋、趙雅芝,李鼎倫
英雄出少年The Young Heroes of Shaolin,20,石修、黃日華、苗橋偉、董瑋,邱家雄
富貴榮華Brothers Four,20,鄭少秋、陳秀珠,
突破Break Through,20,"陳百強, 翁靜晶, 毛舜筠, 莊靜而",
读者实践本示例前,请使用Pandas.read_csv()函数加载该csv文件。
df=pd.read_csv('./result.csv')
如下图所示
![c5956bbfd9bfb274c52a946d8533caf0.png](https://i-blog.csdnimg.cn/blog_migrate/9725087da20ee8a4b7753dc219d65bd9.png)
按行遍历
通过for迭代df.iterrows接口,idx是输出DataFrame内部的索引值,data输出每行单元格的值
for idx,data in df.iterrows():
print("[{}]: {}".format(idx,data))
![0021ab111903d5330c11e141dbc1ed50.png](https://i-blog.csdnimg.cn/blog_migrate/59d78dd0cf7fc9fbd86ef8197882e748.jpeg)
输出如下
![c1cb464938cd34472d88734af1cf057b.png](https://i-blog.csdnimg.cn/blog_migrate/3512553d12dd6529bc71ec53ecee181f.jpeg)
如果我们仅输出每一行特定的列,例如索引为2的列,那么我们使用如下代码
for idx,data in df.iterrows():
print("[{}]: {}".format(idx,data[2]))
其工作的逻辑如下所示
![a2ff1de92c8538b004d30f1e2b8ae93d.png](https://i-blog.csdnimg.cn/blog_migrate/b23933004dbb1cdbd495a48803b0d7e3.jpeg)
输出如下图
![5d1ec1f5440f1938a72a6bb1c6d8e023.png](https://i-blog.csdnimg.cn/blog_migrate/d414f4b9c8b067980009278dd371ea37.jpeg)
来一个有点实质意义的示例吧,例如我要将当前DataFrame中每行的第2列的所有值满足20,都改成35,但这种编程方式是不鼓励的,因为性能非常糟糕
for idx,row in df.iterrows():
if row[1]=='20':
row[1]='35'
如下所示,需要注意的是,当前DataFrame除了索引列外,其他列的单元格,要么是str类型,要么是NaN类型
![e6c0a5a0d0ea160ba5d38616118b7d33.png](https://i-blog.csdnimg.cn/blog_migrate/4fcecac6d416e623e692ab526579735e.jpeg)
按行优先的遍历方式,还有itertuples( )函数,它将返回一个生成器,该生成器以元组生成行值。 让我们尝试一下:
for data in df.itertuples():
print(data)
输出如下图
![c3a61aac0fd3889730ed009fa583e79f.png](https://i-blog.csdnimg.cn/blog_migrate/9742c40c30d6b1229a8096680cfa552c.jpeg)
itertuples()方法有两个参数:index和name。我们可以通过将index参数设置为False来选择不显示索引列:
for data in df.itertuples(index=False):
print(data)
元组不再显示Index,输出如图
![4c4102eb94c26953fc8e909444e88769.png](https://i-blog.csdnimg.cn/blog_migrate/f1730ad744b99bb18fd4d5b967d1dafd.jpeg)
就像您已经注意到的那样,Pandas.itertuples生成器产生具有默认名称Pandas的命名元祖。 您可以选择自己喜欢的任何名称,但始终最好选择与数据相关的名称,如下用例所示
for data in df.itertuples(index=False,name='Drama'):
print(data)
输出如下图
![170b26c6b9b2fc5624c0ec11b1882524.png](https://i-blog.csdnimg.cn/blog_migrate/0df3fb7e32d14a2e76c442a7624e0a26.jpeg)
对于按itertuples()方式的行优先遍历,如果我们只想返回某列的数据,可以在for迭代器返回的tuple添加列索引,
for data in df.itertuples(index=False,name='Drama'):
print(data[2])
输出如下图
![08340b72786204a8b4333591d72363e1.png](https://i-blog.csdnimg.cn/blog_migrate/cf79ba56f85b0fca9dad73e50aa9fc2e.png)
按列遍历
现在,要遍历此DataFrame,我们将使用items( )或iteritems( )函数:
df.items()
这将返回一个生成器:
![861c7ff359569b8e2d0ad5233656dcc1.png](https://i-blog.csdnimg.cn/blog_migrate/1921c4be1450b6e7d4a3306f47344073.jpeg)
我们可以使用它来生成col_name和数据对。 这些对将包含列名和该列的每一行数据。 让我们遍历列名及其数据:
for colName,data in df.items():
print("colName:[{}]ndata:{}".format(colName,data))
其items的逻辑是,先列后行的逻辑依次遍历每个单元格中数据
![70e5e4df8509b52456d0eb203f7c0935.png](https://i-blog.csdnimg.cn/blog_migrate/bdd5f6ee5d0230a67c9b9369bb5ffc8b.jpeg)
输出是:
![3935549569804d8edc618420c9c442fd.png](https://i-blog.csdnimg.cn/blog_migrate/20b37cf77d48a682931eaf102b2f6fd3.jpeg)
如果我们按列优先,仅遍历某一行依次遍历所有列
for colName,data in df.iteritems():
print("colName:[{}]ndata:{}".format(colName,data[2]))
如下图所示
![b522dbd425b3b6570a079172ceae3821.png](https://i-blog.csdnimg.cn/blog_migrate/ef43b6dfacad65a76f9f32c11176ff88.jpeg)
性能问题
Panda的官方文档警告说,迭代DataFrame是一个降低性能的过程。 如果要遍历DataFrame修改数据,不建议在迭代行时修改数据,因为Pandas有时会返回行中的数据副本而不是其引用,这意味着并非所有数据都会被更改。我们对上面的三种迭代方式做一些简单的性能基准
![55cde139e86aef54e6aa866ca10a2a87.png](https://i-blog.csdnimg.cn/blog_migrate/0376e3389eb4b77b02060592a5cb0f4f.jpeg)
如下图,按行遍历的iterrows的性能是最差的,而按行遍历返回tuple的方式性能是最好的,其次是按列遍历的i考虑的teritems是可以考虑的
![cba73a9fad71af60a842e7124b6b12da.png](https://i-blog.csdnimg.cn/blog_migrate/234105b03dc2d1d423aed08fe47566d0.jpeg)
对于小型数据集,可以使用to_string()方法显示所有数据。 对于具有许多列和行的较大数据集,可以使用head(n)或tail(n)方法打印出DataFrame的前n行(n的默认值为5)。