删除特定的csv文件中的前导0

时间:2019-04-25 17:48:16

标签: python pandas csv dataframe

我有一个名为new.csv的csv文件,我正在尝试删除称为代码的特定列中的所有前导0。

id,name,code <br>
0,kevin,010 <br>
1,john,011 <br>
2,casey,020 <br>
3,micheal,030

这只是csv文件外观的一个示例,但几乎有1000行。我只想从代码列中删除前导0。

我正在尝试找到一种解决方案,我也可以编辑整个专栏以供将来参考。例如,假设有一个我要从列中删除的前导字符“ k”。

我在网上看到了一些示例,但是没有用。

这是下面的

import pandas as pd
import sys

with open('new.csv') as infile:
    title = next(infile)
    infile.seek(0)
    table = pd.read_csv(infile)

table.rename(columns={'Unnamed: 2':''}, inplace=True)

table['code'] = table['code'].str.replace("0", "")
sys.stdout.write(title)
table.to_csv(sys.stdout, ',', index=False)

5 个答案:

答案 0 :(得分:2)

您可以使用正则表达式re.sub轻松替换前导零。使用此正则表达式,

0+([1-9][0-9]*)

并用\1代替,基本上是group1内容

Demo

尝试这些Python代码,

import re

s = '''id,name,code <br>
0,kevin,010 <br>
1,john,011 <br>
2,casey,020 <br>
3,micheal,030'''

print(re.sub(r'0+([1-9][0-9]*)', r'\1', s))

打印不带前导零的数字,

id,name,code <br>
0,kevin,10 <br>
1,john,11 <br>
2,casey,20 <br>
3,micheal,30

编辑:

您可以创建这种函数,该函数将文件名作为参数并生成一个名为inputfilename.out的新文件

import re
from shutil import move
from os import remove


def remove_leading_chars(inputfile):
    with open(inputfile, 'r', encoding="utf-8") as infile, open(inputfile+'.out', 'w', encoding="utf-8") as outfile:
        for s in infile.readlines():
            s = re.sub(r',m+', r',', s)
            outfile.write(s)


remove_leading_chars('data.txt')
remove('data.txt')
move('data.txt.out', 'data.txt')
print('writing done')

输入文件data.txt的内容

id,name,code <br>
0,mmmkevin,010 <br>
1,mmmjohn,011 <br>
2,mmmcasey,020 <br>
3,mmmicheal,030

data.txt文件被覆盖的内容

id,name,code <br>
0,kevin,010 <br>
1,john,011 <br>
2,casey,020 <br>
3,icheal,030

答案 1 :(得分:1)

您应该尝试使用字符串切片删除0,例如:

table['code'] = table['code'].str[1:]

此外,如果0后面有逗号,例如:0,,请尝试使用逗号代替:

table['code'] = table['code'].str[2:]

答案 2 :(得分:0)

考虑我的例子:

txt = '''id,name,code <br>
0,kevin,010 <br>
1,john,011 <br>
2,casey,020 <br>
3,micheal,030'''
txt = txt.split('\n')
txt = [i.rpartition(',') for i in txt]
txt = [''.join([i[0],i[1],i[2].lstrip('0')]) for i in txt]
txt = '\n'.join(txt)
print(txt)

输出:

id,name,code <br>
0,kevin,10 <br>
1,john,11 <br>
2,casey,20 <br>
3,michaeal,30

请注意,为简单起见,我对txt内容进行了硬编码。我使用了str方法:rpartition最后拆分了,lstrip摆脱了0

编辑:您可以将.csv视为纯文本文件,并使用read来获取内容,即不要硬编码txt了:

with open('yourfile.csv','r') as f:
    txt = f.read()

最后,不要打印txt,请执行以下操作:

with open('yournewfile.csv','w') as f:
    f.write(txt)

答案 3 :(得分:0)

尝试用以下内容替换行table['code'].str.replace("0", "")

1。这将删除所有前导数字

table['code'].replace('^\d', '', regex=True)

2。这将专门删除前导0

table['code'].replace('^0', '', regex=True)

请注意:要永久替换为inplace=True

table['code'].replace('^0', '', regex=True, inplace=True)

答案 4 :(得分:-1)

当您从文件中读取文件时,我可能建议强制转换为数字。例如int(0001010)将导致1010

默认情况下,DataFrame猜测此列为数字,因此读取它会将其转换为int。

data = pd.read_csv('C:/random/d2',header=None,names=['W1','W2'])
df=pd.DataFrame(data)
print(df)

结果

        W1  W2
0    kevin  10
1     john  11
2    casey  20
3  micheal  30

更新为执行熊猫/广播的详细版本

data = pd.read_csv('C:/random/d2',header=None,names=['W1','W2'])
df=pd.DataFrame(data)
print(df)

dfNew=pd.DataFrame(columns=['W1','W2'])
rows,clumns=df.shape
for index in range(rows):
    tempRow=[df.iat[index,0], int(df.iat[index,1])]
    dfNew.loc[len(dfNew)]=tempRow
print(dfNew)

结果

        W1  W2
0    kevin  10
1     john  11
2    casey  20
3  micheal  30