Python 修改iterrows循环中的数据帧

Python 修改iterrows循环中的数据帧,python,pandas,for-loop,Python,Pandas,For Loop,我是Python新手 我正在尝试使用for循环将前缀(序列号)添加到数据帧中的元素,以便在分析之前进行数据清理/准备 代码是 a=pd.read_excel('C:/Users/HP/Desktop/WFH/PowerBI/CMM data.xlsx','CMM_unclean') a['Serial Number'] = a['Serial Number'].apply(str) print(a.iloc[72,1]) for index,row in a.iterrows(): i

我是Python新手

我正在尝试使用for循环将前缀(序列号)添加到数据帧中的元素,以便在分析之前进行数据清理/准备

代码是

a=pd.read_excel('C:/Users/HP/Desktop/WFH/PowerBI/CMM data.xlsx','CMM_unclean')
a['Serial Number'] = a['Serial Number'].apply(str)
print(a.iloc[72,1])

for index,row in a.iterrows():
    if len(row['Serial Number']) == 6:
        row['Serial Number'] = 'SR0' + row['Serial Number']
        print(row['Serial Number'])

print(a.iloc[72,1])
输出是

C:\Users\HP\anaconda3\envs\test\python.exe C:/Users/HP/PycharmProjects/test/first.py
101306
SR0101306
101306
我不明白为什么会在for循环内部发生这种情况,值在变化,但在它的外部是相同的。

,我读到(从那里强调)

你应该永远不要修改你正在迭代的东西。这并不能保证在所有情况下都有效。根据数据类型,迭代器返回的是一个副本而不是一个视图,对其进行写入将没有任何效果


也许这意味着在你的情况下,复制了一份,没有引用。因此,更改暂时应用于副本,但不应用于数据框中的数据。

由于您已经在使用
apply
,您可以直接在调用
apply
的函数中执行此操作:

def fix_serial(n):
    n_s = str(n)

    if len(n_s) == 6:
        n_s = 'SR' + n_s

    return n_s

a['Serial Number'] = a['Serial Number'].apply(fix_serial)

这将永远不会更改名为
a的实际数据帧

TL;DR:从iTError返回的行是不再连接到原始数据帧的副本,因此编辑不会更改数据帧。但是,您可以使用索引访问和编辑数据帧的相关行


解释

为什么?

ItErrors
返回的行是副本,不再连接到原始数据帧
,因此编辑不会更改数据帧。但是,您可以使用
索引
访问和编辑数据帧的相关行


解决办法是:

import pandas as pd

a = pd.read_excel("Book1.xlsx")
a['Serial Number'] = a['Serial Number'].apply(str)

a.head()
#    ID    Serial Number
# 0   1     SR0101306
# 1   2       1101306

print(a.iloc[0,1])
#101306

for index,row in a.iterrows():
    row = row.copy()
    if len(row['Serial Number']) == 6:
        # use the index and .loc method to alter the dataframe
        a.loc[index, 'Serial Number'] = 'SR0' + row['Serial Number']

print(a.iloc[0,1])
#SR0101306

谢谢,沃尔夫先生,这很有用,非常感谢。很好的解释很高兴我能帮忙。如果有帮助,考虑一下我的回答