Как вернуть несколько латексных или орг-таблиц из исходного блока в режиме орг?
Моя конкретная проблема заключается в том, что я часто использую исходные блоки python в режиме org для запуска одного и того же статистического анализа для множества переменных в фрейме данных, а затем представляю их в виде латексных таблиц. Становится очень утомительно проводить каждый анализ вручную, поэтому я хочу использовать цикл 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, мне нужно вернуть несколько блоков результатов #+ (по одному на каждую латексную или орг-таблицу), чтобы я мог добавить текстовые описания между ними. Такие как:
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 ответа
Вы можете создать список и добавить к нему вывод латекса в каждом цикле:
latex_list=[]
for var in df.columns:
latex_list.append(df[var].value_counts().to_latex())
Может быть, напечатать так:
for e in latex_list:
print(e)
Мне удалось получить что-то близкое к тому, что я хочу, но мне нужно запустить несколько 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
Будет ли работать вывод текста, который вы хотите в 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