在 R markdown 中渲染 pandas 表

Dar*_*ard 6 python-3.x pandas r-markdown

我是 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()
Run Code Online (Sandbox Code Playgroud)

我尝试使用 render() 方法将其保存为 html,然后在 R 块内保存或打印它

{r}
htmltools::save_html(py$ht, "table.html")
htmltools::html_print(py$ht)
Run Code Online (Sandbox Code Playgroud)

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

pandas 文档说了一些关于“将其包装在 IPython.display.HTML 中”的内容,但不了解任何 python,我不确定这是什么意思。

理想情况下,我希望 markdown 块能够使用完全相同的代码呈现与 jupyter 格式相同的表。

谢谢

alp*_*alp 3

print(df.to_markdown())效果很好,但结果仍然很丑陋并且没有交互性。在 R 块中,您可以使用DT::datatable(py$df)

编辑:

找到了一种在单个 python 块中显示 pandas df 的方法rpy2:

  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
}]
Run Code Online (Sandbox Code Playgroud)
  1. 从 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))
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

然后在Python块中,像这样使用它:

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

display(pydisplaydf(df))
Run Code Online (Sandbox Code Playgroud)

df 很好地显示在 RStudio 的查看器窗格中:)