【问题标题】:How to read all columns of an excel file into a pandas data frame until a condition is met?如何将excel文件的所有列读入pandas数据框中,直到满足条件?
【发布时间】:2021-10-04 22:22:54
【问题描述】:

我尝试将 excel 文件读入 pandas 数据框。但我只需要列直到一个名为“结束”的标记。这只是 excel 文件中空列中单元格中的字符串。这个标记之前的列数可以改变,所以我不能设置固定列。

到目前为止,我尝试将整个 excel 文件读入数据框。现在我正在尝试删除一列包含“结束”字符串之后的所有列,或者选择“结束”标记之前的所有列。

我怎样才能做到这一点?

也许是这样的?

df = df.iloc[:, : df != 'End']

我试图像这样找到包含“结束”的列:

end = [col for col in df.columns if 'End' in col]

但列表保持为空。

附:有些单元格有背景颜色,但不包含内容或公式。不知何故,熊猫将它们读取为空单元格,由于某种原因我无法用 na 值填充它们。我尝试了pd.read_excel(***, na_values='^\s+$')df.fillna('', inplace=True) 的各种变体,但没有成功。也许你也知道如何解决这个问题。

编辑:

“结束”位于列的第一个单元格中。导入数据框后,它会显示:

Unnamed 13
End
NaN
*empty

用*empty表示数据框中的这个单元格只是空白,我不能转换成nan。在 Excel 文件中,此列具有背景颜色。也许这就是熊猫感到困惑的原因。这些空单元格显示在 Excel 具有带背景颜色的空单元格的任何位置。

【问题讨论】:

    标签: python excel pandas


    【解决方案1】:

    如果我理解正确,您希望找到包含“结束”的第一列并从 0 到该列过滤列。如果是这样,您可以尝试:

    示例数据框:

    df = pd.DataFrame({'Column1': [1, 2, 3],
                       'Column2': [4, 5, 6],
                       'Column_End': [7, 8, 9],
                       'Column3': [10, 11, 12]})
    

    解决方案:

    end_col = df.columns.get_loc([x for x in df.columns if 'End' in x][-1])
    df = df.iloc[:, 0:end_col+1]
    

    输出:

       Column1  Column2  Column_End
    0        1        4           7
    1        2        5           8
    2        3        6           9
    

    通过使用列表推导,我们发现最后一列名称中包含“End”。然后我们使用get_loc() 函数占据了这个专栏的位置。当我们知道确切位置后,我们使用iloc 过滤了数据框中的某些列。

    如果有时您的文档中可能有带有“End”的列而有时没有 - 您可以为 IndexError 添加异常并将 len(df.columns) 分配给 end_col。然后,您只需从文档中获取所有列。

    编辑

    如果列名总是从 excel 中的第二行开始,您可以将 skiprows=1 添加到 read_excel() 作为参数,然后使用我提供的解决方案。如果您想保留“未命名”列,但通过列下方的第一行进行过滤,您可以这样做:

    end_col = df.iloc[0, :].to_list().index([x for x in df.iloc[0, :] if 'End' in x][-1])
    

    ...然后像上面一样使用 iloc。

    【讨论】:

    • 非常感谢您的帮助。只要“结束”子字符串位于列名中,此解决方案就可以正常工作。不幸的是,在我的情况下,子字符串“End”不在列标题中。您能否快速查看我的解决方案。 ATM 它对我有用,但也许可以以更好的方式完成。
    • 如果您在问题中添加一些小数据样本会更容易。然后我们可以看到'End'这个词在哪里以及整个结构是什么。
    • “结束”位于列的第一个单元格中。导入后显示: Unnamed: 6 End *empty *empty ... with *empty 表示数据框中的该单元格只是空白,我无法转换为 nan。在 excel 文件中,此列具有背景颜色。也许这就是 pandas 感到困惑的原因。
    • 我编辑了我的答案。请立即检查。
    • 很抱歉再打扰您一次。是的,这会很好。不幸的是,所有其他列名都在上面的行中。我知道,这很令人困惑,但我没有创建这个 Excel 文件,也不允许我更改它。我无法共享 Excel 文件,因为它包含受限制的客户数据。但是,尽管如此,我从您的回答中了解到,并认为我将来可能会派上用场。再次感谢您的耐心等待。祝你度过愉快的一周
    【解决方案2】:

    一段时间后,我找到了适合我的解决方案。我必须与 @Arkadiusz 解决方案不同的原因是 'End' 子字符串 不在 数据框的列标题中。我在问题的正文中没有说清楚。否则,他们的解决方案工作得非常好。这是最终对我有用的代码:

    end = df.loc[:, (df == 'End').any()].columns
    
    end_name = end.values[0]
    
    df = df.loc[:, :end_name]
    

    编辑:空单元格包含空字符串''。使用此代码:

    df = df.replace(r'^\s+$', np.nan, regex=True)
    

    我也能解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 2018-04-02
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2017-09-15
      • 2023-01-30
      相关资源
      最近更新 更多