将emacs组织模式表读入python数据框架的优雅方式

将emacs组织模式表读入python数据框架的优雅方式,python,pandas,dataframe,emacs,org-mode,Python,Pandas,Dataframe,Emacs,Org Mode,在使用python时,我经常喜欢使用emacs组织模式创建表。为了阅读表格,我做了如下的事情 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()) 是否有一种更优雅(特别是更短)的

在使用python时,我经常喜欢使用emacs组织模式创建表。为了阅读表格,我做了如下的事情

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())
是否有一种更优雅(特别是更短)的方式将组织模式表读入数据框架?也许还有一种优雅的方法可以将表和python源代码保存在同一个org文件中。

尝试使用

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

下面是对修改后的问题的回答(将表和源代码保存在组织模式文件中)。我从以下地方偷走了熊猫的部分:

有关源块的更多信息,请参见

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


为什么
:colnames否
(而不是
:colnames是
)需要添加列名是我从未理解的事情:有一天,我应该在组织模式邮件列表上发布一个关于它的问题…

让表和源代码块在组织模式文件中处理不是更容易吗?不需要中间CSV文件。至少是简单的事情和实验,这很方便。@NickD:你能举一个详细的例子吗?@NickD:我稍微改变了这个问题,让答案朝这个方向……谢谢。这似乎没有保留列名。你知道吗?试着在源代码块标题中添加
:colnames no
。你可能已经猜到了,我不是熊猫专家,所以我不确定在什么级别需要做什么。但是如果你打算这样做,我强烈建议你阅读文档(那里有很多东西)和实验。编辑答案以添加
:colnames
标题。我的意思是我不能引用源代码块内的列名,例如
D.D=D.a+D.b
。好吧,这可能会有帮助:在代码块内,
tbl[0]
是第一行,即列名:
['a',b',c']
。现在你所需要做的就是告诉熊猫关于它们的事情。
* 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)

Here's a source block that initializes the variable `tbl' with the table `foo' above 
and does to it some pandas things as suggested by Quang Hoang in his answer.
To evaluate the code block, press `C-C C-c' in the code block.
You will then get the result below:

  #+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
  #+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