Python 修改iterrows循环中的数据帧
我是Python新手 我正在尝试使用for循环将前缀(序列号)添加到数据帧中的元素,以便在分析之前进行数据清理/准备 代码是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
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
谢谢,沃尔夫先生,这很有用,非常感谢。很好的解释很高兴我能帮忙。如果有帮助,考虑一下我的回答