我有一个名为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)
答案 0 :(得分:2)
您可以使用正则表达式re.sub
轻松替换前导零。使用此正则表达式,
0+([1-9][0-9]*)
并用\1
代替,基本上是group1内容
尝试这些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