【问题标题】:macro for pandas column setting in hyhy中pandas列设置的宏
【发布时间】:2020-11-06 01:32:26
【问题描述】:

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

(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”调用,也许有更优雅的通用方法来删除这些调用。

【问题讨论】:

    标签: pandas macros lisp hy


    【解决方案1】:

    可以提供帮助的一点语法糖是为get 使用更短的名称,并且无需引用字符串文字。这是来自this library$ 的简单版本。此外,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(“与列”)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2019-12-21
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多