我正在尝试使用 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/