基于行和列格式化Pandas Dataframe 的HTML输出?

zengzsys  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(137)

我有下面的代码输出一个HTML表:

import pandas as pd

df = pd.DataFrame({
    'Color': ['Red', 'Red', 'Yellow', 'Yellow'],
    'Fruit': ['Apple', 'Strawberry', 'Banana', 'Peach'],
    'Weight': [5, 3, 8, 6]
})

df = pd.pivot(df, index='Color', columns='Fruit', values='Weight')

print(df.to_html())

我希望每个单元格的输出都引用它的行(索引)和列值。例如,我希望使用一个格式函数,如下所示:

def format_value(val, row, col):
    return f"<a href=/{row}/{col}>{val}</a>"

但是,我不知道该怎么做,我尝试了以下方法:

df.应用Map()

df = df.applymap(lambda x: format_value(x, row=x.index, col=x.name))

这将返回一个错误:

AttributeError: 'float' object has no attribute 'index'

to_html(格式化程序=...)

def format_cell(val, col, row):

    def f(val):
      return f"/{row}/{col}"
            
    return f

format_map = {}
for col in df.columns:
    format_map[col] = format_cell(col, df.index)

print(df.to_html(formatter=format_map))

但是,df.index返回所有索引,因此无法知道格式化程序具体引用的是哪一行。

创建新 Dataframe

我可以通过创建一个新的 Dataframe 并使用iterrows(),以一种繁琐的方式完成这项工作:

df_formatted = df.copy()
for index, row in df.iterrows():
    for c in df.columns:
        df_formatted[c][index] = f"<a href=/{index}/{c}>{df[c][index]}</a>"

我怎样才能创建一个HTML格式化程序,它同时知道每个值的索引和列?

5f0d552i

5f0d552i1#

这是我能想到的最简单的办法:

def format_value(val, row, col):
    return f"<a href=/{row}/{col}>{val}</a>"

def format_row(row):
    for col in row.index:
        row[col] = format_value(row[col], row.name, col)
    return row

df_copy = df.copy()
print(df_copy.apply(format_row, axis=1).to_html(escape=False))

本质上,它使用apply()来遍历每一行,向该函数传递一个Series,可以使用.name获取Series的索引,它还关闭了转义,以便正确呈现链接。

相关问题