按行将样式应用于 pandas DataFrame
Applying style to a pandas DataFrame row-wise
我 experimenting/learning Python 有一个包含客户信息的数据集。
DataFrame结构如下(这些都是编造的记录):
import pandas as pd
df1 = pd.DataFrame({'left_name' : ['James', 'Mary', 'John', 'Patricia'],
'left_age' : [30, 37, 30, 35],
'right_name' : ['Robert', 'Jennifer', 'Michael', 'Linda'],
'right_age' : [30, 31, 38, 35]})
print(df1)
left_name left_age right_name right_age
0 James 30 Robert 30
1 Mary 37 Jennifer 31
2 John 30 Michael 38
3 Patricia 35 Linda 35
将transpose
方法应用于df1
,我们得到以下视图:
df2 = df1.T
print(df2)
0 1 2 3
left_name James Mary John Patricia
left_age 30 37 30 35
right_name Robert Jennifer Michael Linda
right_age 30 31 38 35
我的目标是为 df2
应用一些样式。具体来说,
left_name
和 right_name
行应以黄色突出显示;
left_age
和 right_age
行应以蓝色突出显示。
我在发帖之前做了一些研究,我设法通过以下方式突出显示 一个 子集:
df2.style.set_properties(subset = pd.IndexSlice[['left_name', 'right_name'], :], **{'background-color' : 'yellow'})
问题是我无法将多种样式组合在一起。如果我使用与上述相同的方法为 left_age
和 right_age
添加额外的蓝色,我 "lose" 以前的样式。
理想情况下,我想要一个将 df2
作为输入和 returns 样式化 DataFrame 的函数。
您可以使用 Styler.apply
创建样式的 DataFrame 并使用 loc
:
按索引值设置行
def highlight(x):
c1 = 'background-color: yellow'
c2 = 'background-color: blue'
df1 = pd.DataFrame('', index=x.index, columns=x.columns)
df1.loc[['left_name','right_name'], :] = c1
df1.loc[['left_age','right_age'], :] = c2
return df1
df1.T.style.apply(highlight, axis=None)
你们太亲密了!您实际上可以 "chain" set_properties
在同一个数据帧上:
df2.style.set_properties(subset = pd.IndexSlice[['left_name','right_name'], :], **{'background-color' : 'yellow'})\
.set_properties(subset = pd.IndexSlice[['left_age','right_age'], :], **{'background-color' : 'blue'})
我确定有更优雅的解决方案 - 但这个可行!
跟进 MattR 的回答:除了链接之外,您还可以将结果分配给样式器以供第一次调用 set_properties
,然后再次调用 set_properties
- 加上略有不同的选择方式行数:
s1 = df1.T.style.set_properties(**{'background-color': 'yellow'}, subset=(['left_name', 'right_name'], slice(None)))
s1 = s1.set_properties(**{'background-color': 'blue'}, subset=(['left_age', 'right_age'], slice(None)))
s1
我 experimenting/learning Python 有一个包含客户信息的数据集。
DataFrame结构如下(这些都是编造的记录):
import pandas as pd
df1 = pd.DataFrame({'left_name' : ['James', 'Mary', 'John', 'Patricia'],
'left_age' : [30, 37, 30, 35],
'right_name' : ['Robert', 'Jennifer', 'Michael', 'Linda'],
'right_age' : [30, 31, 38, 35]})
print(df1)
left_name left_age right_name right_age
0 James 30 Robert 30
1 Mary 37 Jennifer 31
2 John 30 Michael 38
3 Patricia 35 Linda 35
将transpose
方法应用于df1
,我们得到以下视图:
df2 = df1.T
print(df2)
0 1 2 3
left_name James Mary John Patricia
left_age 30 37 30 35
right_name Robert Jennifer Michael Linda
right_age 30 31 38 35
我的目标是为 df2
应用一些样式。具体来说,
left_name
和right_name
行应以黄色突出显示;left_age
和right_age
行应以蓝色突出显示。
我在发帖之前做了一些研究,我设法通过以下方式突出显示 一个 子集:
df2.style.set_properties(subset = pd.IndexSlice[['left_name', 'right_name'], :], **{'background-color' : 'yellow'})
问题是我无法将多种样式组合在一起。如果我使用与上述相同的方法为 left_age
和 right_age
添加额外的蓝色,我 "lose" 以前的样式。
理想情况下,我想要一个将 df2
作为输入和 returns 样式化 DataFrame 的函数。
您可以使用 Styler.apply
创建样式的 DataFrame 并使用 loc
:
def highlight(x):
c1 = 'background-color: yellow'
c2 = 'background-color: blue'
df1 = pd.DataFrame('', index=x.index, columns=x.columns)
df1.loc[['left_name','right_name'], :] = c1
df1.loc[['left_age','right_age'], :] = c2
return df1
df1.T.style.apply(highlight, axis=None)
你们太亲密了!您实际上可以 "chain" set_properties
在同一个数据帧上:
df2.style.set_properties(subset = pd.IndexSlice[['left_name','right_name'], :], **{'background-color' : 'yellow'})\
.set_properties(subset = pd.IndexSlice[['left_age','right_age'], :], **{'background-color' : 'blue'})
我确定有更优雅的解决方案 - 但这个可行!
跟进 MattR 的回答:除了链接之外,您还可以将结果分配给样式器以供第一次调用 set_properties
,然后再次调用 set_properties
- 加上略有不同的选择方式行数:
s1 = df1.T.style.set_properties(**{'background-color': 'yellow'}, subset=(['left_name', 'right_name'], slice(None)))
s1 = s1.set_properties(**{'background-color': 'blue'}, subset=(['left_age', 'right_age'], slice(None)))
s1