将 emacs org-mode 表读入 python pandas 数据帧的优雅方法

stu*_*ent 5 python emacs org-mode dataframe pandas

使用 python pandas 时,我经常喜欢使用 emacs org-mode 创建表。为了阅读表格,我做了类似的事情

import pandas as pd
from numpy import *

D = pd.read_csv('file.dat',sep='|')
D = D.drop(D.columns[0], axis=1)
D = D.drop(D.columns[-1], axis=1)
D = D.rename(columns=lambda x: x.strip())
Run Code Online (Sandbox Code Playgroud)

是否有更优雅(特别是更短)的方法将 org-mode 表读入 pandas 数据帧?也许还有一种优雅的方法可以将表和 python 源代码保存在同一个组织文件中。

Nic*_*ckD 5

这是修改后的问题的答案(将表和源代码保留在 Org 模式文件中)。我从Quang Hoang 的回答中偷走了熊猫部分:

* foo

Here's a table:

  #+NAME: foo
  |  a |   b |    c |
  |----+-----+------|
  |  1 |   1 |    1 |
  |  2 |   4 |    8 |
  |  3 |   9 |   27 |
  |  4 |  16 |   64 |
  |  5 |  25 |  125 |
  |  6 |  36 |  216 |
  |  7 |  49 |  343 |
  |  8 |  64 |  512 |
  |  9 |  81 |  729 |
  | 10 | 100 | 1000 |
#+TBLFM: $2=pow($1, 2) :: $3 = pow($1, 3)
Run Code Online (Sandbox Code Playgroud)

tbl这是一个源代码块,它使用上表初始化变量foo,并按照 Quang Hoang 在他的回答中的建议对其进行一些 pandas 操作。要评估代码块,请按C-C C-c入代码块。然后您将得到以下结果:

#+begin_src python :var tbl=foo :results output

    import pandas as pd

    D = pd.DataFrame(tbl).iloc[:, 1:-1]
    print(D)
#+end_src

  #+RESULTS:
  #+begin_example
       1
  0    1
  1    4
  2    9
  3   16
  4   25
  5   36
  6   49
  7   64
  8   81
  9  100
  #+end_example
Run Code Online (Sandbox Code Playgroud)

有关源块的更多信息,请参阅Org 手册。

编辑:要保留列名称(表的第一行),您可以添加:colnames no到源块标题。列名称本身是在源块内部获取的tbl[0],可以在DataFrame构造函数中使用它来标记列,如下所示(注意与上面相反,这DataFrame是完整的表。我只是使用几种不同的方法来选择打印出来,包括D.c您在评论中询问的方法):

  #+begin_src python :var tbl=foo :results output :colnames no

    import pandas as pd

    D = pd.DataFrame(tbl, columns=tbl[0])
    print(D.c)
    print("===========")
    print(D.iloc[1:, 0:-1])
  #+end_src

  #+RESULTS:
  #+begin_example
  0        c
  1        1
  2        8
  3       27
  4       64
  5      125
  6      216
  7      343
  8      512
  9      729
  10    1000
  Name: c, dtype: object
  ===========
       a    b
  1    1    1
  2    2    4
  3    3    9
  4    4   16
  5    5   25
  6    6   36
  7    7   49
  8    8   64
  9    9   81
  10  10  100
  #+end_example

Run Code Online (Sandbox Code Playgroud)

为什么:colnames no(而不是:colnames yes)需要添加列名称是我一直无法理解的事情:有一天,我应该在 Org 模式邮件列表上发布一个关于它的问题......


Qua*_*ang 2

尝试用

D = pd.read_csv('file.dat', sep='\s*\|\s*').iloc[:, 1:-1]
Run Code Online (Sandbox Code Playgroud)