dataframe 更改某列某值_第17篇:Pandas-遍历DataFrame对象

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

按行遍历

通过for迭代df.iterrows接口,idx是输出DataFrame内部的索引值,data输出每行单元格的值

for idx,data in df.iterrows():
    print("[{}]: {}".format(idx,data))

0021ab111903d5330c11e141dbc1ed50.png

输出如下

c1cb464938cd34472d88734af1cf057b.png

如果我们仅输出每一行特定的列,例如索引为2的列,那么我们使用如下代码

for idx,data in df.iterrows():
    print("[{}]: {}".format(idx,data[2]))

其工作的逻辑如下所示

a2ff1de92c8538b004d30f1e2b8ae93d.png

输出如下图

5d1ec1f5440f1938a72a6bb1c6d8e023.png

来一个有点实质意义的示例吧,例如我要将当前DataFrame中每行的第2列的所有值满足20,都改成35,但这种编程方式是不鼓励的,因为性能非常糟糕

for idx,row in df.iterrows():
    if row[1]=='20':
        row[1]='35'

如下所示,需要注意的是,当前DataFrame除了索引列外,其他列的单元格,要么是str类型,要么是NaN类型

e6c0a5a0d0ea160ba5d38616118b7d33.png

按行优先的遍历方式,还有itertuples( )函数,它将返回一个生成器,该生成器以元组生成行值。 让我们尝试一下:

for data in df.itertuples():
    print(data)

输出如下图

c3a61aac0fd3889730ed009fa583e79f.png

itertuples()方法有两个参数:index和name。我们可以通过将index参数设置为False来选择不显示索引列:

for data in df.itertuples(index=False):
    print(data)

元组不再显示Index,输出如图

4c4102eb94c26953fc8e909444e88769.png

就像您已经注意到的那样,Pandas.itertuples生成器产生具有默认名称Pandas的命名元祖。 您可以选择自己喜欢的任何名称,但始终最好选择与数据相关的名称,如下用例所示

for data in df.itertuples(index=False,name='Drama'):
    print(data)

输出如下图

170b26c6b9b2fc5624c0ec11b1882524.png

对于按itertuples()方式的行优先遍历,如果我们只想返回某列的数据,可以在for迭代器返回的tuple添加列索引,

for data in df.itertuples(index=False,name='Drama'):
    print(data[2])

输出如下图

08340b72786204a8b4333591d72363e1.png

按列遍历

现在,要遍历此DataFrame,我们将使用items( )或iteritems( )函数:

df.items()

这将返回一个生成器:

861c7ff359569b8e2d0ad5233656dcc1.png

我们可以使用它来生成col_name和数据对。 这些对将包含列名和该列的每一行数据。 让我们遍历列名及其数据:

for colName,data in df.items():
    print("colName:[{}]ndata:{}".format(colName,data))

其items的逻辑是,先列后行的逻辑依次遍历每个单元格中数据

70e5e4df8509b52456d0eb203f7c0935.png

输出是:

3935549569804d8edc618420c9c442fd.png

如果我们按列优先,仅遍历某一行依次遍历所有列

for colName,data in df.iteritems():
    print("colName:[{}]ndata:{}".format(colName,data[2]))

如下图所示

b522dbd425b3b6570a079172ceae3821.png

性能问题

Panda的官方文档警告说,迭代DataFrame是一个降低性能的过程。 如果要遍历DataFrame修改数据,不建议在迭代行时修改数据,因为Pandas有时会返回行中的数据副本而不是其引用,这意味着并非所有数据都会被更改。我们对上面的三种迭代方式做一些简单的性能基准

55cde139e86aef54e6aa866ca10a2a87.png

如下图,按行遍历的iterrows的性能是最差的,而按行遍历返回tuple的方式性能是最好的,其次是按列遍历的i考虑的teritems是可以考虑的

cba73a9fad71af60a842e7124b6b12da.png

对于小型数据集,可以使用to_string()方法显示所有数据。 对于具有许多列和行的较大数据集,可以使用head(n)或tail(n)方法打印出DataFrame的前n行(n的默认值为5)。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值