Python 编辑数据帧中的值

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:

我正试图:

将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:
        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
    也能正常工作。