python - 如果行与 pandas 中的头部不匹配,如何删除行?

标签 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 后面也没有逗号。读取 pandas 数据库时有什么方法可以删除这些行吗?或者我应该在阅读之前删除这些行?

最佳答案

我相信你可以使用read_csv使用 error_bad_lines=False 省略包含更多元素(例如 header 和 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

关于python - 如果行与 pandas 中的头部不匹配,如何删除行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58576795/

相关文章:

python - pandas dataframe,从所有行中选择最常见的值

python - 将压缩的 CSV 文件转换为 Dataframe

python - 在 pandas DataFrame 中返回具有公共(public)列值的条目 - python

python - 无法使用 os.walk() 找到文件

python - 解析 IntId

python - Django 模板加载器行为? (得到 Django TemplateDoesNotExist 异常)

Python Pandas : Best strategy to import heterogenious csv file

Python/Pandas 根据最佳值(value)分布选择列

python - 仅在二级索引上的 Pandas 多索引切片

python - Django 安装为本地应用程序