子类化数据框以存储修改后的字符串

时间:2019-08-01 23:14:38

标签: pandas dataframe

我想对数据框进行子类化,这样当我说

df.loc[index,column] = 'green'

由[index,column]指定的相应值采用该值

'background-color: green'

为例。

基本上,在将数据帧发送到excel之前,我需要对数据帧进行很多自定义格式化,由于样式器需要使用这些字符串在数据帧中存储样式,因此我想为我要应用的样式创建子类化的数据帧使存储起来更容易。

我希望我的解释有意义。

条件格式对我不利,因为我要获取的许多颜色都是从现有的html表中提取的,因此我必须进行大量的网页抓取工作才能获得这些颜色。

编辑:pandas样式器对象的工作方式是使用一个函数,该函数将要设置样式的df作为输入,并返回另一个带有相同样式的索引和列的数据框。

例如,我有数据框

df

              A  B  C   D
first second             
A1    2       1  3  2   4
A2    2       5  2  2   3
A3    1       3  4  7   6
A4    4       4  3  3  12
A5    6       2  4  4   7

对于等于2的df值,在将此df导出为ex​​cel时,我想使其背景颜色为蓝色。

所以我将创建一个函数

def make_2_blue(df):
   background_color = pd.DataFrame('',columns=df.columns,index=df.index)   
   background_color[df == 2] = 'background-color: blue'
   return

然后,当我要将其导出到excel时

df.styler.apply(make_2_blue,axis=None).to_excel('blah.xlsx',engine='openpyxl')

现在在我的示例中,我正在对html进行爬网以获取单个单元格的背景色。

我想做的是将一个数据框子类化,以简化这些格式的应用。

基本上,我想创建一个样式器数据框,在其中指定样式,然后当我访问df中的各个值时,它将接收我的字符串并应用所需的格式。

所以可以说我创建了一个背景色的数据框类。我将创建一个名为background_color_df的实例。

background_color_df = pd.DataFrame('',index=df.index,columns=df.columns)
>>> background_color_df
                               A                   B                   C  \
first second
A1    2       background-color:   background-color:   background-color:
A2    2       background-color:   background-color:   background-color:
A3    1       background-color:   background-color:   background-color:
A4    4       background-color:   background-color:   background-color:
A5    6       background-color:   background-color:   background-color:
                               D
first second
A1    2       background-color:
A2    2       background-color:
A3    1       background-color:
A4    4       background-color:
A5    6       background-color:

现在我要在特定的索引和列处分配蓝色

background_color_df.loc['A1','A'] = 'blue'
background_color_df
                                   A                   B                   C  \
first second
A1    2       background-color: blue  background-color:   background-color:
A2    2           background-color:   background-color:   background-color:
A3    1           background-color:   background-color:   background-color:
A4    4           background-color:   background-color:   background-color:
A5    6           background-color:   background-color:   background-color:

                               D
first second
A1    2       background-color:
A2    2       background-color:
A3    1       background-color:
A4    4       background-color:
A5    6       background-color:

1 个答案:

答案 0 :(得分:0)

如果我的问题正确,那么您的数据如下:

             color   foo
background   green   bar
foreground   red     baz

即,一个数据框具有某种类别的属性,例如前景和背景,您需要将它们组合在一起,例如:

             color                     foo
background   background-color: green   background-foo: bar
foreground   foreground-color: red     foreground-foo: baz

请忽略此处的列名和索引名,因为您可以轻松更改它们。

如果这就是您所需要的,则不需要子类DataFrame,这肯定会花费很多工作。您可以对数据框进行后处理,使其看起来像您想要的。例如。通过这样做:

# example data
df= pd.DataFrame({'color': ['green', 'red'], 'foo': ['bar', 'baz']}, index=['background', 'foreground'])

columns_to_transform= ['color', 'foo']  # maybe even: df.columns if you need to transform all columns
for col in columns_to_transform:
    df[col]= df.index + '-' + col + ': ' + df[col]