编辑DataFrame中的值

时间:2016-10-15 01:46:41

标签: python csv pandas dataframe

我试图:

将UPC代码的CSV导入数据帧。如果UPC代码为11个字符,请附加' 0' 0它。例如: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()

但是,当我打印数据时,不会编辑原始值:

enter image description here

有谁知道造成这个问题的原因是什么?

我尝试了其他帖子中提到的set_value方法,但它没有用。

谢谢!

感谢矢量化方法,更清洁!但是,我收到以下错误,该值仍未更新:

enter image description here

3 个答案:

答案 0 :(得分:4)

我可以建议一种不同的方法吗?

#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)

要修复其他人,您可以这样做:

bad_length_indx = clean_data.UPC.astype(str).str.len()>13
clean_data.loc[bad_length] = np.nan

答案 1 :(得分:1)

根据this.categoryDataGridView.Rows[1].DividerHeight = 5; 文件:

  
      
  1. 您应该永远不会修改您正在迭代的内容。这并不能保证在所有情况下都有效。取决于数据   类型,迭代器返回副本而不是视图,并写入   它没有效果。
  2.   

iterrows默默地修改该行的副本,row['UPC'] = ('0' + row['UPC'])保持不变。

采用像@Gene建议的算法的矢量化方法。

答案 2 :(得分:0)

我终于修好了。再次感谢矢量化的想法。如果将来有人遇到这个问题,这里是我使用的代码。另外,请参阅this post了解详情。

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']