Python 编辑数据帧中的值
我正试图: 将UPC代码的CSV导入数据帧。如果UPC代码为11个字符,请在其后面附加“0”。Ex:19962123818-->019962123818 代码如下:Python 编辑数据帧中的值,python,csv,pandas,dataframe,Python,Csv,Pandas,Dataframe,我正试图: 将UPC代码的CSV导入数据帧。如果UPC代码为11个字符,请在其后面附加“0”。Ex:19962123818-->019962123818 代码如下: #check UPC code length. If 11 characters, adds '0' before. If < 11 or > 13, throws Error for index, row in clean_data.iterrows(): if len(row['UPC']) == 11:
#check UPC code length. If 11 characters, adds '0' before. If < 11 or > 13, throws Error
for index, row in clean_data.iterrows():
if len(row['UPC']) == 11:
row['UPC'] = ('0' + row['UPC'])
#clean_data.set_value(row, 'UPC',('0' + (row['UPC']))
print ("Edited UPC:", row['UPC'], type(row['UPC']))
if len(row['UPC']) < 11 or len(row['UPC']) > 13:
print ('Error, UPC length < 11 or > 13:')
print ("Error in UPC:", row['UPC'])
quit()
#检查UPC代码长度。如果为11个字符,则在前面添加“0”。如果<11或>13,则抛出错误
对于索引,clean_data.iterrows()中的行:
如果len(行['UPC'])==11:
行['UPC']=('0'+行['UPC'])
#清除_数据。设置_值(行,'UPC',('0'+(行['UPC']))
打印(“已编辑的UPC:”,第['UPC']行,键入(第['UPC']行)
如果len(第['UPC']行)<11或len(第['UPC']行)>13:
打印('错误,UPC长度<11或>13:')
打印(“UPC中的错误:”,第['UPC']行)
退出
但是,当我打印数据时,不会编辑原始值:
有人知道是什么导致了这个问题吗
我尝试了其他帖子中提到的set_值方法,但没有成功
谢谢
感谢矢量化方法,更干净!但是,我得到以下错误,并且值仍然没有更新:
我能推荐一种不同的方法吗
#identify the strings shorter than 11 characters
fix_indx = clean_data.UPC.astype(str).str.len()<11
#append these strings with a '0'
clean_data.loc[fix_indx] = '0'+clean_data[fix_indx].astype(str)
我能推荐一种不同的方法吗
#identify the strings shorter than 11 characters
fix_indx = clean_data.UPC.astype(str).str.len()<11
#append these strings with a '0'
clean_data.loc[fix_indx] = '0'+clean_data[fix_indx].astype(str)
根据
iterrows
文档:
row['UPC']=('0'+row['UPC'])
以静默方式修改该行的副本,并且clean_数据保持不变
一定要像@Gene所建议的那样采用算法的矢量化方法。根据iterrows
文档:
您应该永远不要修改您正在迭代的内容。这并不能保证在所有情况下都有效。具体取决于数据
类型,迭代器返回一个副本而不是视图,并写入
这不会有任何效果
row['UPC']=('0'+row['UPC'])
以静默方式修改该行的副本,并且clean_数据保持不变
一定要像@Gene所建议的那样采用矢量化的算法。我终于解决了它。再次感谢矢量化的想法。如果将来有人遇到这个问题,这是我使用的代码。另外,请参阅了解更多信息
UPC_11_char = clean_data.UPC.astype(str).str.len() == 11
clean_data.ix[UPC_11_char, 'UPC'] = '0' + clean_data[UPC_11_char]['UPC'].astype(str)
print clean_data[UPC_11_char]['UPC']
我终于修复了它。再次感谢矢量化的想法。如果将来有人有这个问题,这里是我使用的代码。另外,请参阅以获取更多信息
UPC_11_char = clean_data.UPC.astype(str).str.len() == 11
clean_data.ix[UPC_11_char, 'UPC'] = '0' + clean_data[UPC_11_char]['UPC'].astype(str)
print clean_data[UPC_11_char]['UPC']
你的pandas版本是什么?它是版本0.18.1Sorry,事实上,错误消息建议进行更正,即使用.loc[UPC\u 11\u char,'UPC']
,尽管你的.ix
同样有效。你的pandas版本是什么?它是版本0.18.1Sorry,事实上,错误消息建议进行更正,即使用.loc[UPC_11_char,'UPC']
尽管您的.ix
也能正常工作。