By Mejias
背景:如圖所示,下列有一個表格,
在具體的工作中,要求某些列長度一緻,未達到指定長度的單元格前面需要加‘0‘直到指定長度。同時要求第二列’gl_name‘的開頭都為’gl_‘。
思路:dataFrame的每一個單獨的資料都可可以被操作,即可以對其進行字元串操作。
如下所示,我們能夠通過字元操作去修改單元格的值。即可以實作向單元格增加字元擴充單元格的長度。
#fill gl
gl = list(df1.loc[:,'GL'])
for i in range(len(gl)):
txt = df1.loc[i,'GL']
if txt[0:2]!='gl':#判斷GL列每個單元格開頭是不是’gl_’,不是的話加入
df1.loc[i,'GL'] = 'gl' + df1.loc[i,'GL']
從這個思路出發,筆者自定義了兩個普遍使用的方法,來實作工作需求。
自定義的方法:
第一個方法ZeroAutoFill(table,column_name,column_length)實作前面填‘0‘直到指定長度:
{Table:dataFrame;column_name:需要填充的列;column_length:需要達到的長度}
第二個方法Fill(table,column_name,content)實作開頭非指定内容時增加指定内容:
{Table:dataFrame;column_name:需要填充的列;content:開頭要求的内容}
#Function ZeroAutoFill
def ZeroAutoFill(table,column_name,column_length):
listC = list(table.loc[:,column_name])
count = 0
for i in range(len(listC)):
b = "0"
if str(table.loc[i,column_name])!='0':#判斷替換空格之前是否為空格
count = column_length - len(str(listC[i]))#隻需要對有實際值的asin去做添加“0”
if count > 1:
for j in range(1,count):
b = b + '0'#根據需要達到的字元串長度确定此次需要增加的'0'的個數,如需要長度為2,這裡range(1,2)條件就會将b變成'00'
table.loc[i,column_name] = b + str(table.loc[i,column_name])
elif count == 1:#如果還差1個0就達到指定長度,那麼不需要改變要增加的字元串b的值,因為b的初值是一個'0'
table.loc[i,column_name] = b + str(table.loc[i,column_name])
else:#如果不差(即已經為指定長度,那麼就不需要拼接字元串
continue
#Function Fill
def Fill(table,column_name,content):
listD = list(table.loc[:,column_name])
leftLen = len(content)
for i in range(len(listD)):
txt = str(table.loc[i,column_name])
if txt[0:leftLen]!=content:
table.loc[i,column_name] = content + txt
實作效果:
對excel操作的整體代碼:
import pandas as pd
import numpy as np
import os
a = os.getcwd()
os.chdir(r'%s'%a)
filelist = []
list_link=[]
filelist2 = []
for root, dirs,files in os.walk(".",topdown = False):
for name in files:
str1 = os.path.join(root,name)
if str1.split('.')[-1] == 'xlsx':
filelist.append(str1)
for i in filelist:
name = i.split('\\')[1]
filelist2.append(name)
for i in range(len(filelist2)):
list_count = pd.read_excel(r'%s'%filelist2[i],dtype = str)
list_link.append(list_count)
df1 = list_link[0]
df1.fillna(value = '0',inplace=True)#替換空值
df1.to_excel('替換空值後.xlsx')
#Function ZeroAutoFill
def ZeroAutoFill(table,column_name,column_length):
listC = list(table.loc[:,column_name])
count = 0
for i in range(len(listC)):
b = "0"
if str(table.loc[i,column_name])!='0':#判斷替換空格之前是否為空格
count = column_length - len(str(listC[i]))#隻需要對有實際值的asin去做添加“0”
if count > 1:
for j in range(1,count):
b = b + '0'#根據需要達到的字元串長度确定此次需要增加的'0'的個數,如需要長度為2,這裡range(1,2)條件就會将b變成'00'
table.loc[i,column_name] = b + str(table.loc[i,column_name])
elif count == 1:#如果還差1個0就達到指定長度,那麼不需要改變要增加的字元串b的值,因為b的初值是一個'0'
table.loc[i,column_name] = b + str(table.loc[i,column_name])
else:#如果不差(即已經為指定長度,那麼就不需要拼接字元串
continue
#Function Fill
def Fill(table,column_name,content):
listD = list(table.loc[:,column_name])
leftLen = len(content)
for i in range(len(listD)):
txt = str(table.loc[i,column_name])
if txt[0:leftLen]!=content:
table.loc[i,column_name] = content + txt
#all columns that needs to be updated
columns = ['asin','HTS_code','PCR_code']
length = [10,10,8]
for i in range(len(columns)):
ZeroAutoFill(df1,columns[i],length[i])
Fill(df1,'gl_name','gl_')
df1.to_excel('修改後的表格.xlsx',index =False)