Pandas 用于在hy中设置列的宏

Pandas 用于在hy中设置列的宏,pandas,macros,lisp,hy,Pandas,Macros,Lisp,Hy,我觉得我在为以下顺序设置多个派生列的操作编写函数是不必要的: (defn add-cols[d] (do (setv (get d "col0") "0") (setv (get d "col1") (np.where (> 0 (get d "existing-col")) -1 1)) (setv (get d "col2") (* (get d

我觉得我在为以下顺序设置多个派生列的操作编写函数是不必要的:

(defn add-cols[d]
   (do
      (setv (get d "col0") "0")
      (setv (get d "col1") (np.where (> 0 (get d "existing-col")) -1 1))
      (setv (get d "col2") (* (get d "col1") (get d "existing-col")))
      d
      ))
上述内容既不简洁,也不容易理解。如果您能帮助我将此模式转换为宏,我将不胜感激。我是一个宏初学者,但我正在考虑创建这样的东西:

(pandas-addcols d
   `col0 : "0",
   `col1 : (np.where ( > 0 `existing-col) -1 1),
   `col2 : (* `col1 `existing-col))

如果您能在上述方面提供帮助或指导,我们将不胜感激。宏的最终形式也明显不同。最后,最重复的一点是多个“setv”和“get”调用,也许有更优雅的通用方法来删除这些调用。

一点语法上的帮助是为
get
使用一个较短的名称,并删除引用字符串文字的需要。以下是来自的
$
的简单版本。此外,Hy的
setv
已经允许您提供多个目标-值对

(import
  [numpy :as np]
  [pandas :as pd])

(defmacro $ [obj key]
  (import [hy [HyString]])
  `(get (. ~obj loc) (, (slice None) ~(HyString key))))

(setv
  d (pd.DataFrame (dict :a [-3 1 3] :b [4 5 6]))
  ($ d col0) 0
  ($ d col1) (np.where (> 0 ($ d a)) -1 1))

谢谢你,这已经帮了大忙了。不知道我们是否可以在一个块中进一步简化它,在这个块中,我们知道我们将要操作的数据帧,并返回完整的数据帧(即上面示例中“do”的结果)。@dedupe请参阅同一库中的
wc
(“带列”)。