如何将条件颜色样式应用于 Multi-index pandas 数据框中的列
How to apply conditional color styling to a column in a Multi-index pandas dataframe
我已经回答了一个关于使用普通 Dataframe 有条件地应用颜色的问题。
我的问题是如何用 multi-index data-frame 做到这一点?上一题的dataframe是
Value Limit Actual
Issues < 33 0
Rating > 4 4.2
Complaints < 15 18
Time 30 - 45 41
Tip -- -
新数据帧是相同的数据帧,但 header 如下所示
df.columns =pd.MultiIndex.from_product([['summary'], df.columns])
df
所以新的数据框是这样的
Summary
Value Limit Actual
Issues < 33 0
Rating > 4 4.2
Complaints < 15 18
Time 30 - 45 41
Tip -- -
预期的输出类似于上一个问题本身,但在顶部多了一个 header 行。
我尝试将 row['Limit']
替换为 x.loc[:,idx[:,'Limit']]
,其中 idx
是 pd.IndexSlice
,但没有成功
import re
def highlight(row):
numbers = re.findall('[0-9]+', row['Limit'])
if row['Value'] in ('Issues','Rating','Complaints'):
if '>' in row['Limit'] and row['Actual'] > numbers[0]:
color = 'green'
elif row['Actual'] < numbers[0]:
color = 'green'
else:
color = 'red'
else:
if len(numbers) == 0:
color = 'yellow'
elif row['Actual'] > numbers[0] and row['Actual'] < numbers[1]:
color = 'green'
else:
color = 'red'
return f"background-color: {color}"
您需要零钱:
row['Limit']
至:
row[('summary', 'Limit')]
对于 select 列中的 MultiIndex。
编辑:
如果使用:
row[(slice(None),'Limit')]
row[idx[:,'Actual']]
输出一个元素Series
.
因此需要 select 此方法中标量的第一个值:
row[(slice(None),'Limit')].iat[0]
row[idx[:,'Actual']].iat[0]
我已经回答了一个关于使用普通 Dataframe 有条件地应用颜色的问题。
我的问题是如何用 multi-index data-frame 做到这一点?上一题的dataframe是
Value Limit Actual
Issues < 33 0
Rating > 4 4.2
Complaints < 15 18
Time 30 - 45 41
Tip -- -
新数据帧是相同的数据帧,但 header 如下所示
df.columns =pd.MultiIndex.from_product([['summary'], df.columns])
df
所以新的数据框是这样的
Summary
Value Limit Actual
Issues < 33 0
Rating > 4 4.2
Complaints < 15 18
Time 30 - 45 41
Tip -- -
预期的输出类似于上一个问题本身,但在顶部多了一个 header 行。
我尝试将 row['Limit']
替换为 x.loc[:,idx[:,'Limit']]
,其中 idx
是 pd.IndexSlice
,但没有成功
import re
def highlight(row):
numbers = re.findall('[0-9]+', row['Limit'])
if row['Value'] in ('Issues','Rating','Complaints'):
if '>' in row['Limit'] and row['Actual'] > numbers[0]:
color = 'green'
elif row['Actual'] < numbers[0]:
color = 'green'
else:
color = 'red'
else:
if len(numbers) == 0:
color = 'yellow'
elif row['Actual'] > numbers[0] and row['Actual'] < numbers[1]:
color = 'green'
else:
color = 'red'
return f"background-color: {color}"
您需要零钱:
row['Limit']
至:
row[('summary', 'Limit')]
对于 select 列中的 MultiIndex。
编辑:
如果使用:
row[(slice(None),'Limit')]
row[idx[:,'Actual']]
输出一个元素Series
.
因此需要 select 此方法中标量的第一个值:
row[(slice(None),'Limit')].iat[0]
row[idx[:,'Actual']].iat[0]