繁体   English   中英

如何将 excel 文件的所有列读入 pandas 数据帧直到满足条件?

[英]How to read all columns of an excel file into a pandas data frame until a condition is met?

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

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

我怎样才能做到这一点?

也许是这样的?

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

我试图找到包含“结束”的列,如下所示:

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

但是列表仍然是空的。

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

编辑:

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

无名 13
结尾
钠盐
*空的

*empty 意味着数据框中的这个单元格只是空白,我无法转换为 nan。 在 Excel 文件中,此列具有背景颜色。 也许这就是 pandas 感到困惑的原因。 只要 Excel 有带背景色的空单元格,这些空单元格就会出现。

调试视图

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

样本 dataframe:

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]

Output:

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

通过使用列表理解,我们发现最后一列的名称中包含“End”。 然后我们通过使用get_loc() function 获取此列的 position。当我们知道确切的 position 时,我们通过使用iloc从 dataframe 中筛选出某些列。

如果有时您在文档中有带有“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。

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

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)

我也能够解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM