我正在尝试从一个很大的文本文件中获取行,该行与使用pandas的头部具有相同的元素。例如
让我们说我有一个如下的文本文件
a,b,c,d
1,2,3,4
5,6
7,8,9,10
其中a,b,c和d是头。在这种情况下,我不知道第二行是否来自列a或b或c或d。在数字6之后也没有逗号。在读取熊猫数据库时,是否可以删除那些行?还是应该在读取之前删除那些行?
答案 0 :(得分:2)
我相信您可以将error_bad_lines=False
与read_csv
一起使用,以省略具有更多元素(如标头)的行,而DataFrame.dropna
可以删除具有较少元素(如标头数量)的行:
df = pd.read_csv('file', error_bad_lines=False).dropna()
print (df)
a b c d
0 1 2 3.0 4.0
2 7 8 9.0 10.0
预处理解决方案-为每行创建一个列表,测试长度和标题长度,并将其追加到列表列表中,最后传递给DataFrame
构造函数:
缺点是所有值都是字符串,因此必须用DataFrame.astype
进行强制转换:
import csv
out = []
with open('file.csv') as csv_file:
reader = csv.reader(csv_file, delimiter=',')
header = next(reader)
for row in reader:
if (len(row) == len(header)):
out.append(row)
df = pd.DataFrame(out, columns=header).astype(int)
print (df)
a b c d
0 1 2 3 4
1 7 8 9 10
或使用其他长度(如标题)创建行列表,并将其传递给skiprows
参数:
omit = []
with open('file.csv') as csv_file:
reader = csv.reader(csv_file, delimiter=',')
header = next(reader)
for i, row in enumerate(reader, 1):
if (len(row) != len(header)):
omit.append(i)
df = pd.read_csv('file.csv', skiprows=omit)
print (df)
a b c d
0 1 2 3 4
1 7 8 9 10