首页 > 解决方案 > 如果这些行与熊猫中的头部不匹配,如何删除行?

问题描述

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

假设我有一个如下的文本文件

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

其中 a、b、c 和 d 是头部。在这种情况下,我不知道第二行是来自 a 列还是 b 列还是 c 列还是 d 列。数字 6 之后也没有逗号。在读取 pandas 数据库时,有什么方法可以删除这些行吗?或者我应该在阅读之前删除这些行吗?

标签: pythonpandas

解决方案


我相信您可以使用read_csvwitherror_bad_lines=False来省略具有更多元素(如标题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

推荐阅读