如何正确遍历Pandas DataFrame的行数据?
原因说明
直接对pandas的DataFrame对象执行for循环迭代时,默认遍历的是DataFrame的列名序列,因此你原有代码中循环拿到的x是每一列的列名,df[x]取到的自然是整列数据,和遍历行的预期不符。
逐行遍历的实现方案
可根据实际场景选择以下常用方式:
- 使用
iterrows()方法:入门最友好的逐行遍历方案,每次迭代返回(行索引, 行Series对象)格式的元组,可直接通过列名读取行内对应字段值。
对应修改后的代码如下:
注意:import pandas as pd df = pd.DataFrame(data, columns = ['Name','New_addy','PHONE1','PHONE2','EMAIL']) def QuestioningMech(df): for idx, row in df.iterrows(): # 打印当前行全部内容 print(row) # 如需读取指定列,直接通过列名索引即可,例如print(row['Name'])iterrows()返回的行对象是原数据的副本,直接修改row对象不会同步改动原DataFrame,不要在循环中通过该方式修改源数据。 - 使用
itertuples()方法:遍历性能远高于iterrows(),每次迭代返回命名元组,通过属性即可访问字段值,数据量较大时优先选择该方案。
代码示例:def QuestioningMech(df): for row in df.itertuples(index=True): # 开启index参数时,行索引存于row.Index属性,列值直接用列名当属性访问即可 print(row.Name, row.New_addy, row.EMAIL) - 优先选择非遍历方案:如果遍历行的目的是做逐行计算、字段处理,不要使用显式for循环。pandas原生的向量化操作、
df.apply()方法的运行效率比手动循环高1~2个数量级,只有遇到无法向量化的复杂逐行逻辑时,再使用上述两种迭代方法。
内容的提问来源于stack exchange,提问作者ConfusionWhat
相关产品推荐
相关产品推荐

