我有一个 excel 表,它看起来像
然后,我在 Sex 列上创建了一个过滤器来获取所有女性数据,它看起来像:
然后,我想将过滤后的数据导入python。我使用了以下熊猫命令:
df = pd.read_excel(io="test.xlsx", sheetname="Sheet1")
print(df)
Run Code Online (Sandbox Code Playgroud)
问题是我得到了整个数据:
Id Name Age Sex
0 1 Tom 12 M
1 2 Silke 33 F
2 3 Olga 22 F
3 4 Tom 33 M
Run Code Online (Sandbox Code Playgroud)
但是,这不是我想要的,我只想要过滤后的数据:
Id Name Age Sex
1 2 Silke 33 F
2 3 Olga 22 F
Run Code Online (Sandbox Code Playgroud)
我怎么能用python做到这一点?
注意:我之所以要在python中导入过滤后的数据而不是过滤数据,是因为原始excel数据。excel表格中的过滤器非常复杂。它不仅基于许多列,还基于数千个不同的值。如果我在python中过滤数据将是一个大问题。
正如前面评论中提到的,一种非常快速和肮脏的方法是将过滤后的数据复制到一个新的 Excel 文件中(没有任何过滤器),并从这样的文件中获取数据。
一个更优雅和完整的解决方案包括使用openpyxl读取过滤数据。
首先,安装 openpyxl
$ pip install openpyxl
Run Code Online (Sandbox Code Playgroud)
然后,使用这样的脚本来读取可见数据:
from openpyxl import load_workbook
wb = load_workbook('foo.xlsx') # use the actual path of your workbook
ws = wb['Bar'] # use your sheet name instead of Bar
# iterate over all the rows in the sheet
for row in ws:
# use the row only if it has not been filtered out (i.e., it's not hidden)
if ws.row_dimensions[row[0].row].hidden == False:
print row # ...or do what you need
Run Code Online (Sandbox Code Playgroud)
请注意,这row是一个Cells元组。使用属性value访问每个单元格的值:
if ws.row_dimensions[row[0].row].hidden == False:
for cell in row:
print cell.value
Run Code Online (Sandbox Code Playgroud)
您可以使用该逻辑直接从原始过滤文件中获取您的值。
PS:openpyxl 还提供了一个很酷的Pandas 集成。