创建校验位函数
Create check digit function
我正在尝试创建校验位并将它们附加在原始 UPC 之后。这是 sample data
因为有前导 0,所以我必须先将数据读取为字符串:
import pandas as pd
upc = pd.read_csv("/Users/lee/Desktop/upc.csv", dtype = str)
这里有一个校验位算法的例子:
如果upc是003459409000
步骤 (1) 0 + 3*0 + 3 + 3*4 + 5 + 3*9 + 4 + 3*0 + 9 + 3*0 + 0 + 3*0 = 60
步骤 (2) 60 mod 10 = 0
步骤 (3) check digit = 0 (if it's not 0, then check digit = 10 - number in step 2)
基于算法,代码如下:
def add_check_digit(upc_str):
upc_str = str(upc_str)
if len(upc_str) != 12:
raise Exception("Invalid length")
odd_sum = 0
even_sum = 0
for i, char in enumerate(upc_str):
j = i+1
if j % 2 == 0:
even_sum += int(char)
else:
odd_sum += int(char)
total_sum = (even_sum * 3) + odd_sum
mod = total_sum % 10
check_digit = 10 - mod
if check_digit == 10:
check_digit = 0
return upc_str + str(check_digit)
如果我 运行 这个代码,它会给出正确的校验位并将这个结果附加到原始 UPC 的末尾。对于上面的例子,如果我输入:
add_check_digit('003459409000')
输出给出 13 位 UPC 0034594090000
.
现在我的问题是:
此函数仅适用于单个 upc,即我必须 copy/paste 每个 upc 并获取校验位。如何创建适用于数据框中 UPS 列表的函数?每个结果都应 return 一个 13 位 UPC,并在原始 UPC 之后附加校验位。
UPC 被读取为字符串。如何将该功能应用于 UPC?我想我应该以某种方式将字符串转换为数字。
获得新的 UPC 后,如何将结果保存到 csv 文件中?
因为我没有 CSV 文件,所以为我设置了数据,下面的步骤与您的相同
df = pd.read_csv("/Users/lee/Desktop/upc.csv", dtype = str)
数据设置
import pandas as pd
df=pd.DataFrame({"upc_in_file":['003459409000','003459409001','003459409002']})
def add_check_digit(upc_str):
upc_str = str(upc_str)
if len(upc_str) != 12:
raise Exception("Invalid length")
odd_sum = 0
even_sum = 0
for i, char in enumerate(upc_str):
j = i+1
if j % 2 == 0:
even_sum += int(char)
else:
odd_sum += int(char)
total_sum = (even_sum * 3) + odd_sum
mod = total_sum % 10
check_digit = 10 - mod
if check_digit == 10:
check_digit = 0
return upc_str + str(check_digit)
将上述函数应用于 upc 列(从文件中读取的列)
df['new_upc']=df['upc_in_file'].apply(add_check_digit)
现在保存文件!
df.to_csv("my_updated_upc.csv")
这看起来像
我正在尝试创建校验位并将它们附加在原始 UPC 之后。这是 sample data
因为有前导 0,所以我必须先将数据读取为字符串:
import pandas as pd
upc = pd.read_csv("/Users/lee/Desktop/upc.csv", dtype = str)
这里有一个校验位算法的例子:
如果upc是003459409000
步骤 (1) 0 + 3*0 + 3 + 3*4 + 5 + 3*9 + 4 + 3*0 + 9 + 3*0 + 0 + 3*0 = 60
步骤 (2) 60 mod 10 = 0
步骤 (3) check digit = 0 (if it's not 0, then check digit = 10 - number in step 2)
基于算法,代码如下:
def add_check_digit(upc_str):
upc_str = str(upc_str)
if len(upc_str) != 12:
raise Exception("Invalid length")
odd_sum = 0
even_sum = 0
for i, char in enumerate(upc_str):
j = i+1
if j % 2 == 0:
even_sum += int(char)
else:
odd_sum += int(char)
total_sum = (even_sum * 3) + odd_sum
mod = total_sum % 10
check_digit = 10 - mod
if check_digit == 10:
check_digit = 0
return upc_str + str(check_digit)
如果我 运行 这个代码,它会给出正确的校验位并将这个结果附加到原始 UPC 的末尾。对于上面的例子,如果我输入:
add_check_digit('003459409000')
输出给出 13 位 UPC 0034594090000
.
现在我的问题是:
此函数仅适用于单个 upc,即我必须 copy/paste 每个 upc 并获取校验位。如何创建适用于数据框中 UPS 列表的函数?每个结果都应 return 一个 13 位 UPC,并在原始 UPC 之后附加校验位。
UPC 被读取为字符串。如何将该功能应用于 UPC?我想我应该以某种方式将字符串转换为数字。
获得新的 UPC 后,如何将结果保存到 csv 文件中?
因为我没有 CSV 文件,所以为我设置了数据,下面的步骤与您的相同
df = pd.read_csv("/Users/lee/Desktop/upc.csv", dtype = str)
数据设置
import pandas as pd
df=pd.DataFrame({"upc_in_file":['003459409000','003459409001','003459409002']})
def add_check_digit(upc_str):
upc_str = str(upc_str)
if len(upc_str) != 12:
raise Exception("Invalid length")
odd_sum = 0
even_sum = 0
for i, char in enumerate(upc_str):
j = i+1
if j % 2 == 0:
even_sum += int(char)
else:
odd_sum += int(char)
total_sum = (even_sum * 3) + odd_sum
mod = total_sum % 10
check_digit = 10 - mod
if check_digit == 10:
check_digit = 0
return upc_str + str(check_digit)
将上述函数应用于 upc 列(从文件中读取的列)
df['new_upc']=df['upc_in_file'].apply(add_check_digit)
现在保存文件!
df.to_csv("my_updated_upc.csv")
这看起来像