CoderAnswer - 程序员编程问答

消除CSV文件中不需要的换行符

by @Readler

python regex pandas csv

我有一个非常大的CSV文件(百万+行),我想在其上执行一些操作。问题是,有些行有一些不需要的换行符,如下所示:

纽约市;钢铁侠;没有超级大国;
大都市;超人;超级大国;
纽约市;
蜘蛛侠;
超级大国;
Gotham; Batman; no 超级大国;
New York City; Doctor Strange; 超级大国;

该文件因此有三列(locationsuperherosuperpowers)。由于Spider-Man的条目有问题,因为它的条目之间有换行符,所以pandas错误地假设它们是三个单独的行,在第二和第三列中有NaNs

我的想法是在使用正则表达式导入时修复此问题。根据this website,此正则表达式正确匹配所需的行,并且与错误的行(即蜘蛛侠)不匹配。

(.*[;].*[;].*)

它的反向((?!(。* [;]。* [;]。*))不起作用,因为它不仅与三个有缺陷的行不匹配,而且每个正常行的第三个条目。

我的另一种方法是简单地设置列数,然后从整个文件中删除所有换行符。但是,这也不起作用。

superhero_df = pd.read_csv("superheroes.csv",sep ='*; *',skiprows = 12,names = ["location", "superhero", "superpower"],index_col = False,engine = "python")
superhero_df = superhero_df.replace('\r\n','',regex = True)

所需的输出应如下所示:

纽约市;钢铁侠;没有超级大国
大都市;超人;超级大国;
New York City; Spider-Man; 超级大国;
Gotham; Batman; no 超级大国;
New York City; Doctor Strange; 超级大国;

3个答案

1 by @Rizwan M.Tuman

那怎么样:

^([^;]+);[\r\n]*([^;]+);[\r\n]*([^;]+);

并替换为:

\1;\2;\3;

regex101

run here

import re

regex = r"^([^;]+);[\r\n]*([^;]+);[\r\n]*([^;]+);"

test_str = ("New York City; Iron Man; no superpowers;\n"
    "Metropolis; Superman; superpowers;\n"
    "New York City;\n"
    "Spider-Man;\n"
    "superpowers;\n"
    "Gotham; Batman; no superpowers;\n"
    "New York City; Doctor Strange; superpowers;\n\n")

subst = "\\1;\\2;\\3;"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE | re.DOTALL)

if result:
    print (result)
1 by @DYZ

以下正则表达式在每三个字段后删除不需要的换行符和其他空格。它假定字段没有任何内部分号:

print(re.sub(r'([^;]*);\s*([^;]*);\s*([^;]*);\s+', r'\1;\2;\3\n', 
      line, flags=re.M))
#New York City; Iron Man;no superpowers
#Metropolis;Superman;superpowers
#New York City;Spider-Man;superpowers
#Gotham;Batman;no superpowers
#New York City;Doctor Strange;superpowers

您可以在循环中运行它以在使用Pandas之前预处理文件。

0 by @K.Maj

最简单的解决方案:


将pandas导入为pd
import re

string = """New York City;钢铁侠;没有超级大国;
大都市;超人;超级大国;
纽约市;
蜘蛛侠;
超级大国;
Gotham; Batman; no 超级大国;
纽约市;奇怪医生;超级大国;"""

城市= []
超级英雄= []
superpowers = []

splited_list = re.split(';',string)
splited_list.pop(len(splited_list) -  1)

i = 0

而我<len(splited_list) -  1:
    cities.append(splited_list[i])
    superheros.append(splited_list[i + 1])
    superpowers.append(splited_list[i + 2])

    i = i + 3

d​​f = pd.DataFrame({
    "City": cities,
    "Superhero": superheros,
    "superpowers": superpowers
})

相关问题