【问题标题】:Parsing csv files consisting of the header only using Python, Pandas仅使用 Python、Pandas 解析包含标头的 csv 文件
【发布时间】:2017-03-09 02:09:39
【问题描述】:

我正在尝试使用 pandas 读取多个 csv 文件的内容并将其加载到 pandas 数据框中。

所有 csv 文件都包含标题(第一行),它定义了列名,然后是数字数据。我只对读取数字数据感兴趣,因此我使用选项 skiprows=[0]。

例如:

path = 'mypath'
file = 'example1.csv'

我的 example1.csv 类似于:

time varA varB
1.0  2.3  3.2
2.0  4.2  3.4
...  ...  ...

然后我使用这段代码:

array_list = []

for file in os.listdir(path):
    df = pd.read_csv(file, skiprows=[0], header=None)
    array_list.append(df.as_matrix())

这一直有效,直到我得到一个文件,该文件仅包含标题(只有一个原始文件),没有数据,如下例所示,example2.cvs:

time varA varB

我得到了错误

EmptyDataError: No columns to parse from file

关于如何引入仅由标题组成的文件的异常的任何建议,这并不意味着它是空的?

非常感谢您的帮助,

MarcoC

【问题讨论】:

  • 尝试 header='infer'

标签: python csv pandas


【解决方案1】:

try..except怎么样?

array_list = []

for file in os.listdir(path):
    try:
        df = pd.read_csv(file, skiprows=[0], header=None)
        array_list.append(df.as_matrix())
    except EmptyDataError:
        # empty file, skip
        continue

这有len(array_list) != len(os.listdir(path))的缺点。如果您确实想要空数据框来避免这种情况,请使用header='infer',如@sam 建议:

array_list = []

for file in os.listdir(path):
    df = pd.read_csv(file, header='infer')
    array_list.append(df.as_matrix())

对于包含内容的文件

time varA varB

返回

Empty DataFrame
Columns: [time varA varB]
Index: []

【讨论】:

  • 谢谢@Graipher。我必须用array_list 的内容填充一个空数据框。在 for 循环中,我将 array_list.append(df.as_matrix()) 替换为 array_list.append(df)。使用选项as_matrix() 我收到错误TypeError: cannot concatenate a non-NDFrame object。然后,在循环之外我添加了frame = pd.concat(array_list, ignore_index=True)。再次感谢您。
【解决方案2】:

header='infer' 或 header=0 都可以解决问题

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2010-12-14
    • 2016-03-12
    • 2021-06-12
    • 2019-10-08
    • 2016-03-15
    相关资源
    最近更新 更多