给定具有以下内容的csv文件
actual; shouldbe
1,200; 1200
1,2; 1200
12; 12
我希望以两列具有相同值的方式阅读内容。问题是数千个分隔符之后没有尾随零
df = pd.read_csv(file, sep=';', thousands=',')
导致
actual shouldbe
0 1200 1200
1 12 1200
2 12 12
我希望问题很清楚。我不知道如何在pandas或任何其他python和非python工具中清理我的数据。
答案 0 :(得分:3)
我不确定在加载后如果没有一些数据清理就可以完成:
false
答案 1 :(得分:2)
编辑:出乎意料,我发现我的天真解决方案是最快的(包括比@RomanPekar更快的解决方案)。
最快的解决方案:天真的解决方案
df = pd.read_csv(file, dtype='object') # to load as string
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