【问题标题】:Convert a user function to be a dataframe method (or equivalent)将用户函数转换为数据框方法(或等效方法)
【发布时间】:2014-10-17 09:02:00
【问题描述】:

我写了一个简单的函数,从空格分隔的字符串到变量名列表进行变量扩展——只是你老的 'var1 var2 var3'.split() 技巧加上一些简单的通配符扩展。 (实际功能在问题的底部。)

df = pd.DataFrame( { 'cat': [1,2,3], 'car':     [7,8,9], 
                     'dog': [8,8,8], 'pelican': [2,4,6] } )

In [90]: cols( df, 'ca* pelican')
Out[90]: ['car', 'cat', 'pelican']

到目前为止一切顺利,我可以这样使用它:

df[ cols( df, 'ca* pelican') ]

但函数调用中的“df”是多余的。我想知道我能做些什么来代替以下操作之一:

df[ cols('ca* pelican') ]
df.cols( 'ca* pelican' )

我知道后者对于开发人员来说是可能的,但我不认为它对于用户来说是可能的,而且我已经完成了接近零的方法编写,所以也许有办法?无论如何,这就是我是否可以实现上述两种语法之一的问题。这是实际的功能,如果重要的话(别笑,这只是一个简单的概念证明!):

def cols( df, clist):
   clist = clist.split()
   cols = []
   for col in clist:
      if col.endswith('*'):
         for column in df.columns:
            if column.startswith(col[:-1]):
                cols.append(column)
      else:
         cols.append(col)
   return cols

【问题讨论】:

  • 为什么不使用pandas .filter 方法,如df.filter(regex='ca*')df.filter(regex='ca*|pelican')
  • 谢谢,我不知道如何使用过滤器/正则表达式。我会在该函数的更高版本中包含类似的内容。但是,这并不能回答核心问题,也不能解决诸如使代码更具可读性和允许其他变量扩展(例如 VAR1-3 包括 VAR2 但不包括 VAR4)之类的问题。

标签: python pandas


【解决方案1】:

您可以将一个函数作为方法猴子修补到 DataFrame 中。例如,像

这样的函数
def both_sides(df, name):
    keep = [c for c in df.columns if c.startswith(name)
            and c.endswith(name)]
    return df[keep]

可以作为方法添加到类中:

>>> df = pd.DataFrame(np.random.random((4,4)), columns=["a", "ab", "aba", "b"])
>>> both_sides(df, "a")
          a       aba
0  0.775468  0.998379
1  0.430740  0.005156
2  0.231028  0.626962
3  0.194387  0.447785
>>> pd.DataFrame.both_sides = both_sides
>>> df.both_sides("a")
          a       aba
0  0.775468  0.998379
1  0.430740  0.005156
2  0.231028  0.626962
3  0.194387  0.447785

实例作为第一个参数传入的位置(我们通常命名为self)。混合添加工具而不是简单地使用函数是否是一个好主意值得商榷,但没有什么能阻止你在技术上这样做。

【讨论】:

  • 谢谢!太好了,并且确实回答了我的问题,但我会在检查之前将其打开一会儿。
  • 关于添加工具的混合是否是一个好主意对我来说不是“值得商榷”的。对于我的用例,像这样的函数通常可以节省输入并生成更具可读性的代码。作为用户,我非常感谢所有开发人员的工作(并希望最终能做出自己的贡献),但我不理解开发人员的态度,即我们不应该为自己的特定用例定制自己的环境。
  • 这里是文档中猴子补丁的链接:pandas.pydata.org/pandas-docs/dev/faq.html;如果你愿意,你当然可以修补。问题是它没有记录/标准,因此未来的读者会期望这些方法是熊猫特有的,即使它们是本地的。所以猴子补丁在某些情况下可以产生更具可读性的代码;唯一的建议是记录/测试
  • @Jeff LOL,感谢链接上的那个位置。我知道这种功能是用户经常要求的,开发人员经常说“使用已经存在的东西”,所以我想我必须编写一个版本供我自己使用。 FWIW,我认为它经常发生 b/c,与 pandas 相比,这种事情在 stata 中的方便程度仍然是一个非常鲜明的对比(pandas 也很年轻)。有时间我会尽快加入github世界的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多