如何迭代 StyleFrame 中的行?
How to iterate rows in StyleFrame?
我想通过遍历行来查找彩色单元格。
我知道如何迭代列,但不知道如何迭代行。
在 pandas 数据框中,它将是
for i in range(0, len(df.index), 1):
print(df.loc[i, 1])
但是StyleFrame没有loc
。我如何迭代它并检查彩色单元格?
谢谢!
这里是 StyleFrame 维护者...那很有趣...
这里的问题由两部分组成:
Pandas' read_excel
(StyleFrame 使用)的默认行为是跳过空白行。值得庆幸的是,它接受一个关键字参数来改变这种行为,StyleFrame 的 read_excel
将它不知道的每个关键字参数传递给 Pandas。因此这个问题可以很容易地解决:
StyleFrame.read_excel('test.xlsx', read_style=True, skip_blank_lines=False)
第二个 issue/problematic 行为是 openpyxl 设置背景未更改(或已设置为 "automatic" 或 "no fill" 的单元格的背景颜色,取决于您的电子表格软件)到“000000”,这是黑色的。
这在 StyleFrame 中引入了一个错误,老实说,我不确定直到现在才浮出水面。
要解决此问题,您可以对 StyleFrame 的代码进行少量更改。 styler.py 中的第 111 行(假设您使用的是 StyleFrame 的 2.0.5 版)应从
更改
bg_color = openpyxl_style.fill.fgColor.rgb
到
bg_color = openpyxl_style.fill.fgColor.rgb if openpyxl_style.fill.patternType is not None else utils.colors.white
此更改将包含在下一版本中。
然后,在解决了以上两个问题之后,解决您的实际问题就变得相对容易了(尽管没有我希望的那么容易):
from StyleFrame import StyleFrame, utils
def only_cells_with_colored_background(cell):
return cell if cell.style.bg_color not in {utils.colors.white, 'FFFFFFFF'} else np.nan
sf = StyleFrame.read_excel('test.xlsx', read_style=True, skip_blank_lines=False)
sf = StyleFrame(sf.applymap(only_cells_with_colored_background).dropna(axis=(0, 1),
how='all'))
print(sf)
会输出
Unnamed: 0
2 a
3 b
4 c
9 a
10 b
11 c
我计划在未来的版本中实现一个 .style
访问器,所以希望上面的例子会像
一样简单
sf = StyleFrame.read_excel('test.xlsx', read_style=True, skip_blank_lines=False)
sf = sf.loc[~(sf['Unnamed: 0'].style.bg_color == utils.colors.white)]
当我尝试在 StyleFrame 中使用 skip_blank_lines=False
时,出现以下错误:
TypeError: read_excel() got an unexpected keyword argument 'skip_blank_lines'
我想通过遍历行来查找彩色单元格。
我知道如何迭代列,但不知道如何迭代行。
在 pandas 数据框中,它将是
for i in range(0, len(df.index), 1):
print(df.loc[i, 1])
但是StyleFrame没有loc
。我如何迭代它并检查彩色单元格?
谢谢!
这里是 StyleFrame 维护者...那很有趣...
这里的问题由两部分组成:
Pandas'
read_excel
(StyleFrame 使用)的默认行为是跳过空白行。值得庆幸的是,它接受一个关键字参数来改变这种行为,StyleFrame 的read_excel
将它不知道的每个关键字参数传递给 Pandas。因此这个问题可以很容易地解决:StyleFrame.read_excel('test.xlsx', read_style=True, skip_blank_lines=False)
第二个 issue/problematic 行为是 openpyxl 设置背景未更改(或已设置为 "automatic" 或 "no fill" 的单元格的背景颜色,取决于您的电子表格软件)到“000000”,这是黑色的。
这在 StyleFrame 中引入了一个错误,老实说,我不确定直到现在才浮出水面。
要解决此问题,您可以对 StyleFrame 的代码进行少量更改。 styler.py 中的第 111 行(假设您使用的是 StyleFrame 的 2.0.5 版)应从
更改bg_color = openpyxl_style.fill.fgColor.rgb
到
bg_color = openpyxl_style.fill.fgColor.rgb if openpyxl_style.fill.patternType is not None else utils.colors.white
此更改将包含在下一版本中。
然后,在解决了以上两个问题之后,解决您的实际问题就变得相对容易了(尽管没有我希望的那么容易):
from StyleFrame import StyleFrame, utils
def only_cells_with_colored_background(cell):
return cell if cell.style.bg_color not in {utils.colors.white, 'FFFFFFFF'} else np.nan
sf = StyleFrame.read_excel('test.xlsx', read_style=True, skip_blank_lines=False)
sf = StyleFrame(sf.applymap(only_cells_with_colored_background).dropna(axis=(0, 1),
how='all'))
print(sf)
会输出
Unnamed: 0
2 a
3 b
4 c
9 a
10 b
11 c
我计划在未来的版本中实现一个 .style
访问器,所以希望上面的例子会像
sf = StyleFrame.read_excel('test.xlsx', read_style=True, skip_blank_lines=False)
sf = sf.loc[~(sf['Unnamed: 0'].style.bg_color == utils.colors.white)]
当我尝试在 StyleFrame 中使用 skip_blank_lines=False
时,出现以下错误:
TypeError: read_excel() got an unexpected keyword argument 'skip_blank_lines'