我有一個包含錯誤的 csv 檔案。有些行有 4 個分隔符 (;),而大部分行有 5 個分隔符 (;)。我有時有 4 個分隔符的原因是因為有時缺少第二列。
例子:
var1;var2;var3;var4;var5
1;10;john;40;56
2;mary;34;78
3;90.0;smith;52;45
如果我匯入 csv 檔案:
import pandas as pd
df=pd.read_csv('myfile.csv', sep=";")
我獲得資料框:
var1 var2 var3 var4 var5
1 10 john 40 56
2 mary 34 78
3 90.0 smith 52 45
而且我要:
var1 var2 var3 var4 var5
1 10 john 40 56
2 NaN mary 34 78
3 90.0 smith 52 45
也許我可以將資料框分成兩部分(一個帶有 5 個“;”,另一個帶有 4 個“;”)并在最后附加。我從代碼開始:
import csv
with open('myfile.csv',newline='') as fin, open('output.csv','w',newline='') as fout:
reader = csv.reader(fin)
writer = csv.writer(fout)
for row in reader:
if len(row) > 4:
writer.writerow(row)
但我收到錯誤:“行包含 NUL”。
uj5u.com熱心網友回復:
解決方法可能是shiftDataFrame 的一部分:
# read with shifted columns
df = pd.read_csv('myfile.csv', sep=';')
# identify rows with incorrect data
m = df['var5'].isna()
# define columns to correct (second to last)
cols = df.columns[1:]
# correct the invalid rows
df.loc[m, cols] = df.loc[m, cols].shift(axis=1)
輸出:
var1 var2 var3 var4 var5
0 1 10 john 40 56.0
1 2 None mary 34 78.0
2 3 90.0 smith 52 45.0
uj5u.com熱心網友回復:
如果需要,您可以按照以下方式預處理file.csv插入;,讓file.csv內容成為
var1;var2;var3;var4;var5
1;10;john;40;56
2;mary;34;78
3;90.0;smith;52;45
然后
with open("file.csv","r") as fin, open("file_fixed.csv","w") as fout:
for line in fin:
if line.count(';') == 3:
line = line.replace(';',';;',1)
fout.write(line)
確實創建了具有以下內容的 file_fixed.csv
var1;var2;var3;var4;var5
1;10;john;40;56
2;;mary;34;78
3;90.0;smith;52;45
說明:如果行有 3;則替換;使用;;一次(即僅替換第一次;使用;;)
uj5u.com熱心網友回復:
另一種可能的解決方案,基于numpy.rolland pandas.DataFrame.apply:
df = pd.read_csv('myfile.csv', sep=';')
df.iloc[:, 1:] = df.iloc[:, 1:].apply(
lambda x: np.roll(x, 1) if np.isnan(x[3]) else x, axis=1)
輸出:
var1 var2 var3 var4 var5
0 1 10 john 40 56.0
1 2 NaN mary 34 78.0
2 3 90.0 smith 52 45.0
uj5u.com熱心網友回復:
關于您最終遇到的特定錯誤,您將通過打開“output.csv”看到它不包含任何內容,這就是為什么當您嘗試打開它時會引發錯誤(我想是使用 pd.read_csv 嗎?)。
如果您print在閱讀回圈中添加一行,您會注意到每一行都是一個字串的 1 元素串列,您的值由分號分隔,而不是 5 元素的值串列。
這是因為您必須告訴 reader 方法您使用分號作為分隔符(而不是,默認分隔符)。因此,如果您;為閱讀器和撰寫器指定分隔符,它將創建一個新的 csv 檔案,其中僅包含沒有缺失值的行:
import csv
with open('myfile.csv',newline='') as fin, open('output.csv','w',newline='') as fout:
reader = csv.reader(fin, delimiter = ';')
writer = csv.writer(fout, delimiter = ';')
for row in reader:
print(row)
if len(row) > 4:
writer.writerow(row)
希望這可以幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520934.html
標籤:Python熊猫CSV
