如何遍历Pandas DataFrame行并在每次迭代中创建单行DataFrame
解决Pandas遍历DataFrame并逐行生成单行列DataFrame的问题
我明白你的需求啦——想要遍历gmat这个DataFrame,每次循环用当前行生成一个新的DataFrame,还得覆盖掉之前的那个。先看看你给出的示例数据:
YEAR student score mail_id phone Loc
2012 abc 630 abc@xyz.com 1-800-000-000 pqr
2012 pqr 630 pqr@xyz.com 1-800-000-000 abc
你尝试用iterrows()的思路是对的,只是没写完,我来帮你补全并优化这个方案,同时再给你一个效率更高的替代方法。
方法一:用iterrows()实现(最直观)
iterrows()会返回每一行的索引和行数据(Series对象),我们需要把这个Series转成结构一致的单行列DataFrame,代码如下:
import pandas as pd # 先构造你的示例DataFrame(如果已经存在可以跳过这部分) data = { 'YEAR': [2012, 2012], 'student': ['abc', 'pqr'], 'score': [630, 630], 'mail_id': ['abc@xyz.com', 'pqr@xyz.com'], 'phone': ['1-800-000-000', '1-800-000-000'], 'Loc': ['pqr', 'abc'] } gmat = pd.DataFrame(data) # 遍历并生成单行列DataFrame for idx, row in gmat.iterrows(): # 方式1:将Series的值转为列表,指定原列名构造DataFrame df = pd.DataFrame([row.values], columns=gmat.columns) # 方式2:更简洁的写法——把Series转成列再转置成行 # df = row.to_frame().T # 这里可以添加你的后续计算逻辑 print(f"第{idx+1}次迭代的DataFrame:") print(df) print("---")
运行这段代码后,第一次循环df会是第一行数据的DataFrame,第二次循环就会被第二行的数据覆盖,完全符合你的要求。
方法二:用itertuples()实现(效率更高)
如果你的DataFrame数据量比较大,itertuples()的遍历效率比iterrows()要高不少,它返回的是命名元组,转成DataFrame的方式也很简单:
for row in gmat.itertuples(index=False): # 把命名元组转成列表,再构造DataFrame df = pd.DataFrame([list(row)], columns=gmat.columns) # 后续计算逻辑 print("当前迭代的DataFrame:") print(df) print("---")
index=False参数是为了去掉默认返回的行索引,让我们只拿到行数据本身,这样构造出来的DataFrame和原结构完全一致。
需要注意的是,每次循环都会覆盖df变量,如果之后需要保留每一次的结果,可以考虑把df存入一个列表里,但按照你的需求,直接覆盖就没问题啦。
内容的提问来源于stack exchange,提问作者Christina Hughes
相关产品推荐
相关产品推荐

