Python csv中的分隔符少于所需的分隔符

qmelpv7a  于 2022-12-06  发布在  Python
关注(0)|答案(4)|浏览(179)

我有一个有错误的csv文件。一些行有4个分隔符(;),而大多数行具有5个分隔符(;)。我有时有4个分隔符的原因是因为有时第2列不见了。
示例:

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=";")

我获得 Dataframe :

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

也许我可以将 Dataframe 分成两部分(一部分为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”。

x6492ojm

x6492ojm1#

解决方法是将DataFrame的shift部分:

# 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
lf5gs5x2

lf5gs5x22#

如果需要,您可以按照以下方式预处理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个;,则使用;;替换;一次(即,仅使用;;替换第一个;

py49o6xq

py49o6xq3#

基于numpy.rollpandas.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
k2fxgqgv

k2fxgqgv4#

关于你最后遇到的特定错误,你会发现打开你的“output.csv”,它不包含任何东西,这就是为什么当你试图打开它时会抛出错误(* 我想是通过使用pd.read_csv?*)。
如果在阅读循环中添加一行print,您会注意到每行是一个1元素的字符串列表,其中的值用分号分隔,而不是5元素的值列表。
这是因为你必须告诉你的读取器方法你使用分号作为分隔符(而不是默认的,)。所以如果你为你的读取器和写入器指定分隔符;,它将创建一个新的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)

希望这对你有帮助

相关问题