【问题标题】:How to return multiple latex or org tables from an org-mode's source block?如何从 org-mode 的源块返回多个 Latex 或 org 表?
【发布时间】:2018-08-28 00:17:41
【问题描述】:

我的具体问题是,很多时候我在 org 模式下使用 python 源代码块对数据帧的许多变量运行相同的统计分析,然后将它们呈现为乳胶表。手动进行每个分析变得非常繁琐,所以我想使用 for 循环:

#+begin_src python :exports results :session :results latex   
import pandas as pd   
df = pd.DataFrame({'a': [1, 2, 3, 4, 5],
                        'b': [9, 8, 7, 6, 5]})

for var in df.columns:
    df[var].value_counts().to_latex()
#+end_src

问题是它只返回源块返回的最后一个值(for循环的最后一次运行。

#+Results:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} &  b \\
\midrule
7 &  1 \\
6 &  1 \\
5 &  1 \\
9 &  1 \\
8 &  1 \\
\bottomrule
\end{tabular}
#+END_LaTeX

那么有没有办法从一个源代码块中实际获取多个乳胶或组织表?

编辑: 考虑@dschwilk 的答案,我需要返回多个#+Results 块(每个latex 或org 表一个),以便我可以在它们之间添加文本描述。如:

Description for table 1
#+RESULTS:
#+BEGIN_LaTeX
\begin{tabular}{lr}
\toprule
{} &  a \\
\midrule
5 &  1 \\
4 &  1 \\
3 &  1 \\
2 &  1 \\
1 &  1 \\
\bottomrule
\end{tabular}
#+END_LaTeX

Description for table 2    
#+RESULTS:
\begin{tabular}{lr}
\toprule
{} &  b \\
\midrule
7 &  1 \\
6 &  1 \\
5 &  1 \\
9 &  1 \\
8 &  1 \\
\bottomrule
\end{tabular}
#+END_LaTeX

【问题讨论】:

    标签: python org-mode org-table


    【解决方案1】:

    可以在 python 中创建您想要的文本输出吗?例如,将生成的 LaTeX 收集起来并添加 \table{}\caption

    #+begin_src python :exports results :session :results latex   
    import pandas as pd   
    df = pd.DataFrame({'a': [1, 2, 3, 4, 5],
                            'b': [9, 8, 7, 6, 5]})
    
    var_dict = {}
    for var in df.columns:
        var_dict[var] = df[var].value_counts().to_latex()
    
    res = '\n'.join(['\\begin{table}\n\\caption{Variable: %s} \n\n %s\n\end{table}' % (key, value) for (key, value) in var_dict.items()])
    res
    #+end_src
    
    #+results:
    #+BEGIN_EXPORT latex
    \begin{table}
    \caption{Variable: a} 
    
     \begin{tabular}{lr}
    \toprule
    {} &  a \\
    \midrule
    5 &  1 \\
    4 &  1 \\
    3 &  1 \\
    2 &  1 \\
    1 &  1 \\
    \bottomrule
    \end{tabular}
    
    \end{table}
    \begin{table}
    \caption{Variable: b} 
    
     \begin{tabular}{lr}
    \toprule
    {} &  b \\
    \midrule
    7 &  1 \\
    6 &  1 \\
    5 &  1 \\
    9 &  1 \\
    8 &  1 \\
    \bottomrule
    \end{tabular}
    
    \end{table}
    #+END_EXPORT
    

    【讨论】:

    • @dschwik 好吧,不完全是。我目前正在做类似的事情,但将每个乳胶表连接为一个字符串,并且与您的解决方案中的操作相同,但这并不允许我在它们之间进行评论(实际上是描述)以进行数据分析。我编辑了原始问题以澄清。感谢您的意见!
    【解决方案2】:

    我设法得到了接近我想要的东西,但我必须运行多个 src_blocks(我真的想避免)。

    我有一个源块,它创建所有表并将它们存储在一个列表中,并为每个表创建一个新的 src_block 并返回它。

    例如:

    #+begin_src python :exports results :session :results silent)
      import pandas as pd
      results_tables = []
      d = pd.DataFrame({'a': [1, 2, 3, 4, 5],
                        'b': [9, 8, 7, 6, 5]})
    
      for var in d.columns:
          results_tables.append(d[var].value_counts().to_latex())
    #+end_src
    
    #+RESULTS:
    #+begin_src python :exports results :session :results latex
    results_tables[0]
    #+end_src
    
    #+RESULTS:
    #+BEGIN_LaTeX
    \begin{tabular}{lr}
    \toprule
    {} &  a \\
    \midrule
    5 &  1 \\
    4 &  1 \\
    3 &  1 \\
    2 &  1 \\
    1 &  1 \\
    \bottomrule
    \end{tabular}
    #+END_LaTeX
    
    #+begin_src python :exports results :session :results latex
    results_tables[1]
    #+end_src
    
    #+RESULTS:
    #+BEGIN_LaTeX
    \begin{tabular}{lr}
    \toprule
    {} &  b \\
    \midrule
    7 &  1 \\
    6 &  1 \\
    5 &  1 \\
    9 &  1 \\
    8 &  1 \\
    \bottomrule
    \end{tabular}
    #+END_LaTeX
    

    【讨论】:

      【解决方案3】:

      您可以创建一个列表并在每个循环中将乳胶输出附加到它:

      latex_list=[]
      for var in df.columns:
          latex_list.append(df[var].value_counts().to_latex())
      

      可以这样打印:

      for e in latex_list:
          print(e)
      

      【讨论】:

      • 我试过了,但我在结果块中得到了很长的乳胶表语法行,它并排显示每个表,虽然我可以轻松修复类似的问题,但它不会让我包含cmets 在桌子之间。
      • 您能否在每个乳胶输出之前遍历打印 cmets 的列表?我不确定打印语句是否会以您想要的格式输出它我给出了一个示例循环。
      • 感谢@BobbyDurrett,但大多数时候 cmets 可以很广泛,因为我使用 org-mode 编写数据科学报告,而使用打印语句对我来说不可行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多