在 R Markdown 中呈现 Pandas 表格

6

我是Python的新手,但我正在尝试在R Markdown块内呈现使用以下Python代码生成的表格。当在Jupyter中运行时,Python代码会输出一个漂亮格式的表格,但我似乎无法在Markdown文档中复制它。

{python, engine.path = '/usr/bin/python3'}
import pandas as pd
import numpy as np

df1 = pd.read_csv(r'./data/crest_results_table.txt', sep='\t')
df2 = pd.read_csv(r'./data/crest_formats_table.txt', sep='\t')

results_table = df1.pivot_table(values=['Result'],index=['Anlys_Mthd','CAS','AnalTParam','RDCSRS','NRDCSRS','IGWSRS'],columns=['SampNum','LabID','SampDate'],aggfunc=np.max)

formats_table = df2.pivot_table(values=['Result'],index=['Anlys_Mthd','CAS','AnalTParam','RDCSRS','NRDCSRS','IGWSRS'],columns=['SampNum','LabID','SampDate'],aggfunc=np.max)

def color_cells(s):
    if s == -1:
        return 'color:{0}; background-color: white; font-weight:bold; font-style:italic; font-size:small'.format('black')
    elif s == -2:
        return 'color:{0}; background-color: orange; font-weight:bold; font-style:italic; font-size:small'.format('black')
    elif s == -3:
        return 'color:{0}; background-color: yellow; font-weight:bold; font-size:small'.format('black')
    elif s == -4:
        return 'color:{0}; background-color: beige; font-weight:bold; font-size:small'.format('black')
    else:
        return 'color:{0}; font-size:small'.format('grey')

t = results_table.style.apply(lambda x: formats_table.applymap(color_cells), axis=None)

ht = t.render()

我试过使用render()方法将其保存为html,然后在一个R代码块中保存或打印它。

{r}
htmltools::save_html(py$ht, "table.html")
htmltools::html_print(py$ht)

然而,当我查看保存的html文件时,即使在浏览器中,也无法正确呈现。

pandas文档提到了“将其包装在IPython.display.HTML中”,但由于不了解任何python,我不确定这意味着什么。

理想情况下,我希望markdown块可以像jupyter一样使用相同的代码格式化相同的表格。

谢谢

1个回答

3

print(df.to_markdown()) 运行良好,但结果仍然不美观且缺乏交互性。在 R 代码块中,可以使用 DT::datatable(py$df)

编辑:

发现使用 rpy2 在单个 Python 块中显示 pandas df 的方法:

  1. 创建 R 脚本 'pydisplaydf.r'。
library(DT)

PyDisplayDf <- function(dataframe) {
    dt <- DT::datatable(dataframe, 
                  options = list(lengthChange = FALSE, 
                  sDom  = '<"top">lrt<"bottom">ip', 
                  paging = FALSE))
    dt
}]

从Python中获取R脚本并显示df。
from IPython.display import display

import rpy2.rinterface as rinterface
rinterface.initr()

from rpy2.robjects import pandas2ri
pandas2ri.activate()

import rpy2.robjects as robjects

r = robjects.r
pydisplaydf = r.source('pydisplaydf.r')[0]

display(pydisplaydf(df))
  1. (可选) 每次显示df时都会弹出Python信息,这很令人恼火,我发现这个脚本非常有用:
@contextmanager
def suppress_stdout():
    with open(os.devnull, "w") as devnull:
        old_stdout = sys.stdout
        sys.stdout = devnull
        try:  
            yield
        finally:
            sys.stdout = old_stdout

然后在Python代码块中,可以像这样使用:

with suppress_stdout():
    pandas2ri.activate()
    r = robjects.r
    pydisplaydf = r.source('pydisplaydf.r')[0]

display(pydisplaydf(df))

数据框 df 在 RStudio 的查看器窗格中显示得很好 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接