【问题标题】:Pandas: how to designate starting row to extract dataPandas:如何指定起始行以提取数据
【发布时间】:2017-12-26 14:07:20
【问题描述】:

我正在使用 Pandas 库和 Python。

我有一个 Excel 文件,它在 Excel 工作表的顶部有一些标题信息,我不需要这些信息来提取数据。

但是,标题信息可能需要更长的行,因此无法预测它可能需要多长时间。

所以,我的数据提取应该从显示“ID”的位置开始... 对于这种特殊情况,它从第 5 行开始,但它可能会改变。

图片显示在底部(我在第 5 行后显示为敏感信息)。

如何将其置于逻辑中(跳过标题并跳转到第 5 行)? 模式应该是,行标题从“ID,EMP_ID”等开始。

with open('File.xls') as fp:
    skip = next(filter(
        lambda x: x.startswith('ID'),
        enumerate(fp)
    ))[0]

df = pd.read_excel('File.xls', usercols=['ID', 'EMP_ID'], skiprows=skip)
print df

【问题讨论】:

    标签: python excel pandas dataframe


    【解决方案1】:

    您可以使用pd.read_csv 并指定skiprows=4

    df = pd.read_csv('test.csv', skiprows=4)
    

    【讨论】:

    • 对于这个非常具体的示例,此代码有效,但我更喜欢 a_guest 的答案,因为它确实根据字符串匹配确定表从哪里开始
    • 嗯,这是一个了不起的答案!投了赞成票!
    【解决方案2】:

    您可以手动检查标题行,然后使用read_csvs 关键字参数skiprows

    with open('data.csv') as fp:
        skip = next(filter(
            lambda x: x[1].startswith('ID'),
            enumerate(fp)
        ))[0]
    

    然后跳过行:

    df = pandas.read_csv('data.csv', skiprows=skip)
    

    这样您就可以支持任意长度的前标题部分。


    对于 Python 2:

    import itertools as it
    
    with open('data.csv') as fp:
        skip = next(it.ifilter(
            lambda x: x[1].startswith('ID'),
            enumerate(fp)
        ))[0]
    

    【讨论】:

    • 我收到此错误。 AttributeError: 'tuple' 对象没有属性 'startswith' 我的代码显示在顶部。
    • @KingJava 你说得对,我解决了这个问题。 enumerate 产生元组,所以我们需要选择第二项。
    • 我收到此错误。 TypeError:列表对象不是迭代器。
    • 那么我猜你正在使用 Python 2。我的答案是 Python 3,但是有多种方法可以解决它。您可以使用from itertools import ifilter as filter(或类似地使用ifilter),或者,您可以再次下标:filter(...)[0][0],而不是使用next。或者您可以将filter 的结果转换为迭代器:next(iter(filter(...)))[0]
    • 我在“enumerate(fp)”所在的行收到了这条消息“StopIteration”
    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多