【问题标题】:pandas returning empty DataFrames for CSVpandas 为 CSV 返回空的 DataFrame
【发布时间】:2016-08-04 22:28:29
【问题描述】:

我有一些大型 csv 和 xlsx 文件,我需要为其设置 pandas DataFrames。我有在目录中定位这些文件的代码(打印时,这些显示正确的路径名)。然后将这些路径传递给一个帮助函数,该函数旨在为文件设置所需的 DataFrame,然后将数据传递给其他函数进行一些操作。一旦完成,我打算将数据写入文件(通过加载模板、将数据写入模板并保存该文件)。

我目前有如下代码:

import pandas
# some set-up functions (which work; verified using print statements)

def createDataFrame(filename):
    if filename.endswith('.csv'):
        df = pandas.read_csv(StringIO(filename), skip_blank_lines=True, index_col=False,
                             encoding="utf-8", skipinitialspace=True)

当我尝试print(df) 时,我得到:

空数据框

列:[a.csv]

索引:[]

print(StringIO(filename)) 给了我:

<_io.stringio>

但是,当我在函数中省略 filename 周围的 StringIO() 时,我会收到此错误:

OSError: 文件 b'a.csv' 不存在

我能找到这方面信息的所有地方要么只是说import and start using,要么谈论使用read_csv()而不是from_csv()from this question,这在这里不是很有帮助),并且甚至the current pandas docs 基本上都说应该像把文件传给pandas.read_csv() 一样简单。

1) 我已检查我是否拥有完全权限,并且该文件有效且存在。为什么我会收到 OSError?

2) 当我使用StringIO() 时,为什么我仍然在这里得到一个空的DataFrame?我该如何解决这个问题?

提前致谢。

【问题讨论】:

  • 为什么需要StringIO?没有这个就不行吗?即pandas.read_csv(filename,.....)
  • 正如我在问题中发布的那样,如果没有 StringIO,我会收到 OSError。我一直无法发现原因,并且希望任何可以解决该问题的指针(然后也许一切都会奏效)

标签: csv python-3.x pandas dataframe


【解决方案1】:

我已经解决了。

StringIO 是这个问题的根本原因。因为我在 Windows 上,os.path.is_file() 返回 False,我得到了错误:

OSError: 文件 b'a.csv' 不存在

直到我偶然发现this page from the Python 2.5 docs,我才发现在Windows 上调用实际上应该是os.path.isfile(),因为它在后台使用ntpath。这是为了更好地处理系统之间路径名的差异(Windows 使用'\',Unix 使用'/')。

因为我的路径中发生了一些奇怪的事情,pandas 无法将 CSV 文件正确加载到 DataFrame 中。

通过简单地改变我的代码:

import pandas
# some set-up functions (which work; verified using print statements)

def createDataFrame(filename):
    if filename.endswith('.csv'):
        df = pandas.read_csv(StringIO(filename), skip_blank_lines=True, index_col=False,
                             encoding="utf-8", skipinitialspace=True)

到这里:

import pandas
# some set-up functions (which have been updated)

def createDataFrame(filename):
    basepath = config.complete_datasets_dir
    fullpath = os.path.join(basepath, filename)

    if filename.endswith('.csv'):
        df = pandas.read_csv(fullpath, skip_blank_lines=True, index_col=False,
                             encoding="utf-8", skipinitialspace=True)

并适当更新调用该函数的函数:

def somefunc():
    dfs = []
    data_lists = getInputFiles() # checks data directory for files containing info
    for item in data_lists:
        tdata = createDataFrames(item)
        dfs.append(tdata)
    print(dfs)

我能够得到我正在寻找的输出:

[    1   2   3   4   5   6   7   8   9   10
0  11  12  13  14  15  16  17  18  19  20
1  21  22  23  24  25  26  27  28  29  30
2  31  32  33  34  35  36  37  38  39  40,     1  2  3  4  5  6  7  8  9  10
0  11  12  13  14  15  16  17  18  19  20
1  21  22  23  24  25  26  27  28  29  30]

这是两个 DataFrame 的列表,其中第一个来自仅包含数字 1-40 的 CSV(总共 4 行,没有标题);第二个文件只包含数字 1-30(格式相同)。

我希望这对将来的某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2020-01-07
    • 2017-08-08
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多