循环 pandas xlsxwriter sheet
Looping through pandas xlsxwriter sheet
我想使用 pandas 在 excel-sheet 中创建条件格式。如果 A 列和 B 列小于 C 列中的相应值,则它们应该是红色的。我怎样才能正确地完成它,为什么我的循环提前停止了 2 行?
import numpy as np
import pandas as pd
d = pd.DataFrame(np.random.randint(1, 4, (15, 3)), columns = ['A', 'B', 'C'])
writer = pd.ExcelWriter('c:\users\MYNAME\desktop\xl_loop.xlsx') # please change!
d.to_excel(writer, 'Sheet1', index = False)
worksheet = writer.sheets['Sheet1']
for i in (range(d.shape[0])):
worksheet.conditional_format(
'A{}:B{}'.format(i, i),
{'type': 'icon_set',
'icon_style': '3_traffic_lights',
'icons': [{'criteria': '>', 'type': 'number', 'value': d.iloc[i, 2]},
{'criteria': '=', 'type': 'number', 'value': d.iloc[i, 2]},
{'criteria': '<', 'type': 'number', 'value': d.iloc[i, 2]} ]} )
writer.save()
您可以使用 Styling:
(d.style
.apply(lambda c: (c < d['C']).map({True:'background-color: red', False:''}))
.to_excel('c:/temp/res.xlsx', index=False, engine='openpyxl'))
结果:
您的范围计算和定位有几个 off-by-one 错误,这就是为什么您的范围短了 2 行的原因。
但是,没有必要为每一行创建条件格式。您可以按如下方式为整个范围创建一个:
import numpy as np
import pandas as pd
d = pd.DataFrame(np.random.randint(1, 4, (15, 3)), columns = ['A', 'B', 'C'])
writer = pd.ExcelWriter('xl_loop.xlsx')
d.to_excel(writer, 'Sheet1', index = False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
red_format = workbook.add_format({'bg_color': '#FFC7CE',
'font_color': '#9C0006'})
start_row = 1
end_row = start_row + d.shape[0] -1
start_col = 0
end_col = 1
worksheet.conditional_format(start_row, start_col, end_row, end_col,
{'type': 'cell',
'criteria': '<',
'value': '$C2',
'format': red_format})
writer.save()
输出:
我想使用 pandas 在 excel-sheet 中创建条件格式。如果 A 列和 B 列小于 C 列中的相应值,则它们应该是红色的。我怎样才能正确地完成它,为什么我的循环提前停止了 2 行?
import numpy as np
import pandas as pd
d = pd.DataFrame(np.random.randint(1, 4, (15, 3)), columns = ['A', 'B', 'C'])
writer = pd.ExcelWriter('c:\users\MYNAME\desktop\xl_loop.xlsx') # please change!
d.to_excel(writer, 'Sheet1', index = False)
worksheet = writer.sheets['Sheet1']
for i in (range(d.shape[0])):
worksheet.conditional_format(
'A{}:B{}'.format(i, i),
{'type': 'icon_set',
'icon_style': '3_traffic_lights',
'icons': [{'criteria': '>', 'type': 'number', 'value': d.iloc[i, 2]},
{'criteria': '=', 'type': 'number', 'value': d.iloc[i, 2]},
{'criteria': '<', 'type': 'number', 'value': d.iloc[i, 2]} ]} )
writer.save()
您可以使用 Styling:
(d.style
.apply(lambda c: (c < d['C']).map({True:'background-color: red', False:''}))
.to_excel('c:/temp/res.xlsx', index=False, engine='openpyxl'))
结果:
您的范围计算和定位有几个 off-by-one 错误,这就是为什么您的范围短了 2 行的原因。
但是,没有必要为每一行创建条件格式。您可以按如下方式为整个范围创建一个:
import numpy as np
import pandas as pd
d = pd.DataFrame(np.random.randint(1, 4, (15, 3)), columns = ['A', 'B', 'C'])
writer = pd.ExcelWriter('xl_loop.xlsx')
d.to_excel(writer, 'Sheet1', index = False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
red_format = workbook.add_format({'bg_color': '#FFC7CE',
'font_color': '#9C0006'})
start_row = 1
end_row = start_row + d.shape[0] -1
start_col = 0
end_col = 1
worksheet.conditional_format(start_row, start_col, end_row, end_col,
{'type': 'cell',
'criteria': '<',
'value': '$C2',
'format': red_format})
writer.save()
输出: