根据 excel sheet 中的单元格颜色和文本颜色对数据框进行子集化
Subsetting a dataframe based on cell color and text color in excel sheet
我有一个 excel sheet 超过 1000 列和 300 行。这些单元格中的一些具有正常数据,而一些单元格具有红色背景色,而一些单元格具有正常的白色背景但文本是红色的。例如,我的 excel sheet 如下所示:
我正在将此 excel sheet 读入 Python (pandas) 以将其用作数据框并对其执行进一步的操作。但是,红色文本和红色单元格需要与正常单元格区别对待。
因此,我想将上面的 table 分成 3 个 table,这样: Table 一个包含所有单元格,但红色背景单元格是空的。 Table 2 只有文本为红色的那些行和列。 Table 3 只有那些背景为红色的行和列。
我想这在 Pandas 中是做不到的。我尝试使用 StyleFrame 但失败了。
有人可以在这方面提供帮助吗?在这种情况下是否有任何 python 软件包有用?
这几乎就是实现这一目标的方法。它不漂亮,因为 StyleFrame 并非真正设计用于这种方式。
正在读取源 Excel 文件
import numpy as np
from StyleFrame import StyleFrame, utils
sf = StyleFrame.read_excel('test.xlsx', read_style=True, use_openpyxl_styles=False)
1) 除了红色背景的单元格外,所有单元格都是空的
def empty_red_background_cells(cell):
if cell.style.bg_color in {utils.colors.red, 'FFFF0000'}:
cell.value = np.nan
return cell
sf_1 = StyleFrame(sf.applymap(empty_red_background_cells))
print(sf_1)
# C1 C2 C3 C4 C5 C6
# 0 a1 1.0 s nan 1001.0 1234.0
# 1 a2 12.0 s nan 1001.0 4322.0
# 2 a3 nan s nan 1001.0 4432.0
# 3 a4 232.0 s nan 1001.0 4432.0
# 4 a5 343.0 s 99.0 nan nan
# 5 a6 3.0 s 99.0 1001.0 4432.0
# 6 a7 34.0 s 99.0 1001.0 4432.0
# 7 a8 5.0 s nan 1001.0 4432.0
# 8 a9 6.0 s 99.0 1001.0 4432.0
# 9 a10 565.0 s 99.0 nan 4432.0
# 10 a11 5543.0 s 99.0 1001.0 4432.0
# 11 a12 112.0 s 99.0 1001.0 nan
# 12 a13 34345.0 s 99.0 1001.0 4432.0
# 13 a14 0.0 s 99.0 nan nan
# 14 a15 453.0 s 99.0 1001.0 nan
2) 只有红色文本的单元格
def only_cells_with_red_text(cell):
return cell if cell.style.font_color in {utils.colors.red, 'FFFF0000'} else np.nan
sf_2 = StyleFrame(sf.applymap(only_cells_with_red_text).dropna(axis=(0, 1), how='all'))
# passing a tuple to pandas.dropna is deprecated since pandas 0.23.0, but this can be
# avoided by simply calling dropna twice, once with axis=0 and once with axis=1
print(sf_2)
# C2 C6
# 7 nan 4432.0
# 8 nan 4432.0
# 9 565.0 nan
# 10 5543.0 nan
# 11 112.0 nan
3) 只有红色背景的单元格
def only_cells_with_red_background(cell):
return cell if cell.style.bg_color in {utils.colors.red, 'FFFF0000'} else np.nan
sf_3 = StyleFrame(sf.applymap(only_cells_with_red_background).dropna(axis=(0, 1), how='all'))
# passing a tuple to pandas.dropna is deprecated since pandas 0.23.0, but this can be
# avoided by simply calling dropna twice, once with axis=0 and once with axis=1
print(sf_3)
# C4 C6
# 0 99.0 nan
# 1 99.0 nan
# 2 99.0 nan
# 3 99.0 nan
# 13 nan 4432.0
# 14 nan 4432.0
我有一个 excel sheet 超过 1000 列和 300 行。这些单元格中的一些具有正常数据,而一些单元格具有红色背景色,而一些单元格具有正常的白色背景但文本是红色的。例如,我的 excel sheet 如下所示:
我正在将此 excel sheet 读入 Python (pandas) 以将其用作数据框并对其执行进一步的操作。但是,红色文本和红色单元格需要与正常单元格区别对待。
因此,我想将上面的 table 分成 3 个 table,这样: Table 一个包含所有单元格,但红色背景单元格是空的。 Table 2 只有文本为红色的那些行和列。 Table 3 只有那些背景为红色的行和列。
我想这在 Pandas 中是做不到的。我尝试使用 StyleFrame 但失败了。
有人可以在这方面提供帮助吗?在这种情况下是否有任何 python 软件包有用?
这几乎就是实现这一目标的方法。它不漂亮,因为 StyleFrame 并非真正设计用于这种方式。
正在读取源 Excel 文件
import numpy as np
from StyleFrame import StyleFrame, utils
sf = StyleFrame.read_excel('test.xlsx', read_style=True, use_openpyxl_styles=False)
1) 除了红色背景的单元格外,所有单元格都是空的
def empty_red_background_cells(cell):
if cell.style.bg_color in {utils.colors.red, 'FFFF0000'}:
cell.value = np.nan
return cell
sf_1 = StyleFrame(sf.applymap(empty_red_background_cells))
print(sf_1)
# C1 C2 C3 C4 C5 C6
# 0 a1 1.0 s nan 1001.0 1234.0
# 1 a2 12.0 s nan 1001.0 4322.0
# 2 a3 nan s nan 1001.0 4432.0
# 3 a4 232.0 s nan 1001.0 4432.0
# 4 a5 343.0 s 99.0 nan nan
# 5 a6 3.0 s 99.0 1001.0 4432.0
# 6 a7 34.0 s 99.0 1001.0 4432.0
# 7 a8 5.0 s nan 1001.0 4432.0
# 8 a9 6.0 s 99.0 1001.0 4432.0
# 9 a10 565.0 s 99.0 nan 4432.0
# 10 a11 5543.0 s 99.0 1001.0 4432.0
# 11 a12 112.0 s 99.0 1001.0 nan
# 12 a13 34345.0 s 99.0 1001.0 4432.0
# 13 a14 0.0 s 99.0 nan nan
# 14 a15 453.0 s 99.0 1001.0 nan
2) 只有红色文本的单元格
def only_cells_with_red_text(cell):
return cell if cell.style.font_color in {utils.colors.red, 'FFFF0000'} else np.nan
sf_2 = StyleFrame(sf.applymap(only_cells_with_red_text).dropna(axis=(0, 1), how='all'))
# passing a tuple to pandas.dropna is deprecated since pandas 0.23.0, but this can be
# avoided by simply calling dropna twice, once with axis=0 and once with axis=1
print(sf_2)
# C2 C6
# 7 nan 4432.0
# 8 nan 4432.0
# 9 565.0 nan
# 10 5543.0 nan
# 11 112.0 nan
3) 只有红色背景的单元格
def only_cells_with_red_background(cell):
return cell if cell.style.bg_color in {utils.colors.red, 'FFFF0000'} else np.nan
sf_3 = StyleFrame(sf.applymap(only_cells_with_red_background).dropna(axis=(0, 1), how='all'))
# passing a tuple to pandas.dropna is deprecated since pandas 0.23.0, but this can be
# avoided by simply calling dropna twice, once with axis=0 and once with axis=1
print(sf_3)
# C4 C6
# 0 99.0 nan
# 1 99.0 nan
# 2 99.0 nan
# 3 99.0 nan
# 13 nan 4432.0
# 14 nan 4432.0