如何在 Pandas DataFrame 中迭代行?
今天和大家聊聊一个在数据处理过程中常见的问题:如何迭代Pandas DataFrame的行。
在日常数据处理工作中,我们经常需要遍历DataFrame的每一行,做一些数据处理或者计算。 Pandas作为数据处理的利器,自然提供了多种方法来实现这一需求。
接下来,我会详细介绍几种常见的方法,并给出相应的代码示例和注释。
iterrows()是Pandas中最常见的迭代方法之一。它返回的是每行的索引和行数据,行数据以Series的形式呈现。
输出:
输出:
可以看到,itertuples()返回的namedtuple对象,使得访问每列数据时更加高效。如果你不需要对行数据进行修改,这是一个非常好的选择。
输出:
apply()的好处在于它的灵活性,可以轻松地对每行数据进行复杂的操作。不过,和iterrows()一样,它的性能也不是特别优。
输出:
在这个例子中,我们通过矢量化操作直接对整个DataFrame的两列进行相加,得到新的列c3。这种操作不仅简洁明了,而且性能极佳。
在实际开发中,我们总是需要在代码的可读性和性能之间找到一个平衡点。
希望今天的分享能对大家在数据处理过程中有所帮助。 有什么问题或者更好的方法,欢迎在评论区讨论哦!
资料包含了 《IDEA视频教程》 、 《最全python面试题库》 、 《最全项目实战源码及视频》 及 《毕业设计系统源码》 ,总量高达 650GB 。 全部 免费领取 !全面满足各个阶段程序员的学习需求 。
在日常数据处理工作中,我们经常需要遍历DataFrame的每一行,做一些数据处理或者计算。 Pandas作为数据处理的利器,自然提供了多种方法来实现这一需求。
接下来,我会详细介绍几种常见的方法,并给出相应的代码示例和注释。
方法一:使用iterrows()
iterrows()是Pandas中最常见的迭代方法之一。它返回的是每行的索引和行数据,行数据以Series的形式呈现。
import pandas as pd# 创建DataFramedf = pd.DataFrame({'c1': [10, 11, 12], 'c2': [100, 110, 120]})df = df.reset_index() # 确保索引和行数配对# 使用iterrows()进行迭代for index, row in df.iterrows():print(row['c1'], row['c2'])
输出:
iterrows()的使用非常简单直观,但要注意,它的性能并不是最优的。因为它每次迭代时会将每行数据转换成Series对象,这在处理大数据时会非常慢。10 10011 11012 120
方法二:使用itertuples()
如果你对性能要求较高,可以考虑使用itertuples()。它返回的是一个namedtuple,其中包含每行的数据。相比iterrows(),itertuples()的性能更好,因为它避免了将行数据转换为Series对象。# 使用itertuples()进行迭代for row in df.itertuples(index=False, name='Pandas'):print(row.c1, row.c2)
输出:
10 10011 11012 120
可以看到,itertuples()返回的namedtuple对象,使得访问每列数据时更加高效。如果你不需要对行数据进行修改,这是一个非常好的选择。
方法三:使用apply()
虽然apply()并不是直接的迭代方法,但在某些情况下可以起到类似的作用。apply()函数允许我们对DataFrame的每一行或每一列应用一个函数。# 定义一个处理函数def process_row(row):print(row['c1'], row['c2'])# 使用apply()迭代行df.apply(process_row, axis=1)
输出:
10 10011 11012 120
apply()的好处在于它的灵活性,可以轻松地对每行数据进行复杂的操作。不过,和iterrows()一样,它的性能也不是特别优。
方法四:矢量化操作
在Pandas中,最推荐的还是使用矢量化操作,因为它们充分利用了底层的C和NumPy的优化,性能非常高。很多时候,我们不需要显式地迭代每一行,而是可以直接对整个DataFrame进行操作。# 矢量化操作df['c3'] = df['c1'] + df['c2']print(df)
输出:
index c1 c2 c30 0 10 100 1101 1 11 110 1212 2 12 120 132
在这个例子中,我们通过矢量化操作直接对整个DataFrame的两列进行相加,得到新的列c3。这种操作不仅简洁明了,而且性能极佳。
小结
迭代DataFrame的行有多种方法可选,具体选择哪种方法要看你的需求和数据规模。如果只是简单的遍历,小数据量下使用iterrows()或者itertuples()都可以;如果对性能有更高要求,或者数据量较大,尽量使用矢量化操作。在实际开发中,我们总是需要在代码的可读性和性能之间找到一个平衡点。
希望今天的分享能对大家在数据处理过程中有所帮助。 有什么问题或者更好的方法,欢迎在评论区讨论哦!
目前,对编程、职场感兴趣的同学,大家可以联系我微信: golang404 ,拉你进入“程序员交流群”。🔥 虎哥私藏精品 热门推荐 🔥 虎哥作为一名老码农,整理了全网最全 《python高级架构师资料合集》 。
资料包含了 《IDEA视频教程》 、 《最全python面试题库》 、 《最全项目实战源码及视频》 及 《毕业设计系统源码》 ,总量高达 650GB 。 全部 免费领取 !全面满足各个阶段程序员的学习需求 。