pandas 在Python中使用iterrows和next函数遍历DataFrame的每一行

lmyy7pcs  于 2023-05-05  发布在  Python
关注(0)|答案(3)|浏览(295)

我会写一段代码,在Python中使用iterrows和next函数迭代DataFrame的每一行,下面是源代码:

import pandas as pd

#load data frame from csv file
fd = pd.read_csv('Pokemon.csv')

# iterate through each row 
for _ in range(5):
    _, row = next(df.iterrows())
    print(row)

但是当我们运行代码时,它只显示第一行五次,这是什么问题?因为df.iterrows()是一个迭代器。但是当像这样改变循环时:

# iterate through each row 
for _, row in df.iterrows():
    print(row)

它显示前五行数据,那么为什么在循环中使用next函数和iterrows方法,它只显示第一行五次,而不是显示前五行数据?
....................

42fyovps

42fyovps1#

在第一段代码中,当你使用next函数时,你在循环内部调用'next(df.iterrows())',每次运行时都会创建一个新的迭代器,从0开始。因此,它每次都会打印 Dataframe 的第一个索引。
第二段代码的工作方式是在循环外(声明中)使用'df.iterrows()',因此它可以正确运行。
尊重口袋妖怪数据框BTW

v64noz0r

v64noz0r2#

因为你在每个循环中都调用了df.iterrows():
正确使用它:

import pandas as pd

#load data frame from csv file
fd = pd.read_csv('Pokemon.csv')

# iterate through each row 
df_iterator = df.iterrows()
for _ in range(5):
    _, row = next(df_iterator)
    print(row)

但更好的方法是这样做:

import pandas as pd

#load data frame from csv file
fd = pd.read_csv('Pokemon.csv')

# iterate through each row 
for i, (_, row) = enumerate(df.iterrows()):
    if i == 5:
        break;
    print(row)
6ojccjat

6ojccjat3#

让我们暂时忘记df.iterrows()。你觉得下面的代码打印出来的效果如何?

for _ in range(5):
    v = next(iter(range(6)))
    print(v)

是的,它将打印0 5次。
它每次运行循环时都会创建一个新的迭代器,因此next对一个新的迭代器对象进行操作,并只给出第一个值。
而且这也不是df.iterroows()的使用方式,在大多数情况下,正如mozway的评论所建议的那样,除非你已经探索了矢量化的方法,否则你不必使用iterrows(),然后使用apply,如果即使这样也不起作用,那么就使用iterrows()

相关问题