如何从组织模式的源块返回多个乳胶或组织表?

时间:2018-08-28 00:17:42

标签: python org-mode org-table

我的具体问题是,很多时候我在组织模式下使用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块(每个乳胶或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

3 个答案:

答案 0 :(得分:0)

是否要在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

答案 1 :(得分:0)

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

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

也许像这样打印:

for e in latex_list:
    print(e)

答案 2 :(得分:0)

我设法得到了一些接近我想要的东西,但是我必须运行多个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