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 源代码保存在同一个组织文件中。
这是修改后的问题的答案(将表和源代码保留在 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 模式邮件列表上发布一个关于它的问题......
尝试用
D = pd.read_csv('file.dat', sep='\s*\|\s*').iloc[:, 1:-1]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1709 次 |
最近记录: |