编辑:出乎意料的是,我发现我的天真解决方案是最快的(甚至比@RomanPekar的解决方案更快)。
最快的解决方案:天真的解决方案
df = pd.read_csv(file, dtype='object')
def fix(string):
l = string.split(',')
if len(l) > 1 and len(l[-1]) < 3:
l[-1] = l[-1] + (3-len(l[-1])) * '0'
return int(''.join(l))
df['actual'].apply(fix)
最慢的解决方案:向量化解决方案:
missing = (3 - df['actual'].str.split(',').str.get(-1).str.len())
pad = missing.mul(pd.Series(len(missing) * ['0']))
pad = np.where(df['actual'].str.contains(','), pad, '')
pd.to_numeric((df['actual'].str.replace(',', '') + pad))
它只是以向量化的形式执行了朴素方法所做的事情。
性能比较:
%timeit df['actual'].apply(fix)
100 loops, best of 3: 5.48 ms per loop
%timeit df.actual.apply(lambda x: ''.join(k if i==0 else k.ljust(3, '0') for i,k in enumerate(x.split(',')))).astype(int)
100 loops, best of 3: 8.34 ms per loop
%timeit pd.to_numeric((df['actual'].str.replace(',', '') + np.where(df['actual'].str.contains(','), (3 - df['actual'].str.split(',').str.get(-1).str.len()).mul(pd.Series(len(df) * ['0'])), '')))
100 loops, best of 3: 12.6 ms per loop