Pandas读取CSV文件如何去除空白行

9

我正在将一个CSV文件作为DataFrame读入,同时定义每列的数据类型。如果CSV文件中有空白行,这段代码会报错。我该如何在不包含空白行的情况下读取CSV文件?

dtype = {'material_id': object, 'location_id' : object, 'time_period_id' : int, 'demand' : int, 'sales_branch' : object, 'demand_type' : object }

df = pd.read_csv('./demand.csv', dtype = dtype)

我想到了一种解决方法,但不确定这是否是最有效的方式:

df=pd.read_csv('demand.csv')
df=df.dropna()

然后重新定义 df 中的列数据类型。

编辑:代码 -

import pandas as pd
dtype1 = {'material_id': object, 'location_id' : object, 'time_period_id' : int, 'demand' : int, 'sales_branch' : object, 'demand_type' : object }
df = pd.read_csv('./demand.csv', dtype = dtype1)
df

错误 - ValueError: 第二列整数列中有NA值

我的CSV文件快照 - 输入图片说明文字


1
你能提供一下错误吗?我在这个数据集中尝试了一个例子:owner,car Pedro,Honda Antonio,Hyunday 当我执行这段代码时:cars_df = pd.read_csv('cars.csv') 尽管有一个空行,但这段代码仍然可以正常工作: owner car 0 Pedro Honda 1 Antonio Hyunday - Antonio Andrés
1
请检查您的整个文件,确保所有包含数据的行中时间段(第二列)也有一个整数值。错误提示说明在第二列中出现了NA值-因此可能在某些地方第二列中存在非整数字符。另外:请使用Notepad++或类似软件打开CSV文件-而不是Excel/OpenOffice/LibreOffice。这样您就可以看到分隔符了。可能会有一些只包含",,,,,,"的行,这将是一个填充的行,但所有值都为空。 - Patrick Artner
pandas默认将空行填充为NaN。这可能是导致问题的原因吗? - Karvy1
是的,我看到空行是 ,,,,, - Karvy1
有没有解决 ,,,,, 的方法?(除了手动从CSV文件中删除该行) - Karvy1
显示剩余2条评论
6个回答

7

这对我有效。

def delete_empty_rows(file_path, new_file_path):
    data = pd.read_csv(file_path, skip_blank_lines=True)
    data.dropna(how="all", inplace=True)
    data.to_csv(new_file_path, header=True)

1
这个有效。关键在于 dropna() 调用中的 how="all" - 它仅消除完全为空的行(没有一个列具有值)。 - nonbeing

2
尝试像这样做:

尝试类似这样的方法:

data = pd.read_table(filenames,skip_blank_lines=True, a_filter=True)

4
read_csv 的默认设置是 skip_blank_lines 为 True。明确指定 skip_blank_lines = True 没有帮助改变这个设置。 - Karvy1
2
TypeError: parser_f() got an unexpected keyword argument 'a_filter' - Oleg Melnikov
Oleg,你必须拥有不同版本的pandas。 - fuwiak

0

在这里,您需要指定 .dropna(how='all')

当您使用 how='all' 时,只有包含 NaN 的行才会被删除。如果您不使用 how='all',则任何具有任何列值为 NaN 的行也将被删除,您将得到一个更小的数据框。


0
df = pd.read_csv('./demand.csv', dtype = dtype).dropna(how='all') 

运行良好


3
你的答案可以通过添加支持性信息来改进。请编辑以添加更多细节,例如引用或文档,以便他人可以确认您的答案是否正确。您可以在帮助中心了解有关如何编写良好答案的更多信息。 - moken

-1

解决方案可能是:

data = pd.read_table(filenames,skip_blank_lines=True, na_filter=True)

-4

我不确定它是否高效,但它有效。这段代码在读取csv时不会加载nan值。

df = pd.read_csv('demand.csv').dropna()

在这里,您需要指定.dropna(how='all')

当您执行how='all'时,只有包含NaN的行才会被删除。如果您不执行how='all',则任何具有任何列值为NaN的行也将被删除,您将得到一个更小的数据框。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接