我正在尝试对一个非常大的csv文件运行回归。但是,许多列构造为表示二进制情况,并且只有1个值记录在csv中。应该为0的值列为“'(空)
有没有办法可以解析CSV文件中的所有值,以便''值被记录为0?
Ex:我想转换一下:
One,Two,Three,Four
1,,,1
,,1,
1,,1,
,,,1
这样的事情:
One,Two,Three,Four
1,0,0,1
0,0,1,0
1,0,1,0
0,0,0,1
这是我到目前为止的代码。我使用DictReader
来修复我需要更新的值。但是,我完全停留在如何将更新后的dict
恢复为'固定'csv文件。到目前为止,我尝试过的所有东西都破了。
import csv
import pandas
with open('TestCSV.csv','r') as infile,open('Fixed.csv','w') as outfile:
r = csv.DictReader(infile)
w = csv.DictWriter(outfile)
for row in r:
for val in row:
if len(row[val])<1:
row[val]='0'
#w.write_row(row) # Produces TypeError
答案 0 :(得分:3)
for row in r:
for val in row:
if len(row[val])<1:
row[val]='0'
w.write_row(row)
你必须实际告诉它写行
答案 1 :(得分:1)
如果你真的想使用csv模块,你需要修复的代码中有多个错误,你需要将fieldnames
传递给csv.DictWriter
然后写下它们和空字符串的长度将是1
,因此csv.DictWriter
永远不会为真,所以不会有任何改变:
with open('in.csv', 'r') as infile, open('Fixed.csv', 'w') as outfile:
r = csv.DictReader(infile)
w = csv.DictWriter(outfile, fieldnames=r.fieldnames)
w.writeheader()
for row in r:
for k, v in row.items():
if v == "''":
row[k] = "0"
w.writerow(row)
要更改原始文件,实际上只需使用str.replace
并在没有csv模块的情况下打开文件,就可以更改原始文件,fileinput可以使用inplace=True
:< / p>
import fileinput
import sys
for line in fileinput.input("in.csv",inplace=True):
sys.stdout.write(line.replace("''","0"))
输出:
One,Two,Three,Four
1,0,0,1
0,0,1,0
1,0,1,0
0,0,0,1
或者使用带有NamedTemporaryFile的shutil.move,写入tempfile,使用move替换原始文件和更新的文件:
from tempfile import NamedTemporaryFile
来自shutil import move的
with open('TestCSV.csv', 'r') as infile, NamedTemporaryFile(dir=".", delete=False) as outfile:
for line in infile:
outfile.write(line.replace("''", "0"))
move(outfile.name,'TestCSV.csv')
或者,如果您想要新文件,请使用file.write
:
with open('TestCSV.csv','r') as infile,open('Fixed.csv','w') as outfile:
for line in infile:
outfile.write(line.replace("''","0"))
每行只有一个空字符串或“1”,因此更换空字符串更简单。
如果您打算使用数据实际创建df,则可以使用pandas使用数据框和df.replace轻松完成此操作:
df = pd.read_csv("in.csv")
df.replace("''","0",inplace=True)
print(df)
One Two Three Four
0 1 0 0 1
1 0 0 1 0
2 1 0 1 0
3 0 0 0 1
# work on df
.......
# save results to csv
df.to_csv("fixed.csv",index=False)
输出:
One,Two,Three,Four
1,0,0,1
0,0,1,0
1,0,1,0
0,0,0,1
答案 2 :(得分:0)
您可以替换值:
df = pd.read_csv('.../temp.csv')
# Replace quotes
[df.replace(x, 0, inplace=True) for x in ['""', "''"]]
# Replace NAs
df.fillna(0, inplace=True)
# Save to csv
df.to_csv('.../Fixed.csv')