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 格式相同的表。
谢谢
print(df.to_markdown())效果很好,但结果仍然很丑陋并且没有交互性。在 R 块中,您可以使用DT::datatable(py$df)
编辑:
找到了一种在单个 python 块中显示 pandas df 的方法rpy2:
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)
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)
@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 的查看器窗格中:)
| 归档时间: |
|
| 查看次数: |
1522 次 |
| 最近记录: |