在csv文件中成千上万的分隔符后,Pandas解析了丢失零的问题

时间:2016-12-16 14:27:12

标签: python csv pandas dataframe

给定具有以下内容的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工具中清理我的数据。

2 个答案:

答案 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