如果行与熊猫的头部不匹配,如何删除行?

时间:2019-10-27 05:08:21

标签: python pandas

我正在尝试从一个很大的文本文件中获取行,该行与使用pandas的头部具有相同的元素。例如

让我们说我有一个如下的文本文件

a,b,c,d
1,2,3,4
5,6
7,8,9,10

其中a,b,c和d是头。在这种情况下,我不知道第二行是否来自列a或b或c或d。在数字6之后也没有逗号。在读取熊猫数据库时,是否可以删除那些行?还是应该在读取之前删除那些行?

1 个答案:

答案 0 :(得分:2)

我相信您可以将error_bad_lines=Falseread_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