【问题标题】:Using Custom C functions with Pandas (an easy way)在 Pandas 中使用自定义 C 函数(一种简单的方法)
【发布时间】:2021-01-20 11:40:44
【问题描述】:

有没有办法让自定义 C 函数作用于 pandas DF?我知道我可以将一个 c 函数包装在一个 python 函数中,并在逐行迭代中使用它,但这似乎效率低下。我知道 pandas 是用 c 编写的。我想要一种简单的方式来告诉熊猫“使用这个 c 函数”。这很幼稚,但是像这样

...
cFunc = get_c_function_some_how()

for i in range(1000):
    df = df.use_c_function(cFunc)

use_df(df)
...

我的用例是我一遍又一遍地进行一组简单但计算量较大的计算,并且我想让这组特定的计算显着加快

编辑:我想以某种方式将整个 Pandas Dataframe 传递给 C 函数会很好,实际上迭代可能无论如何都应该发生在 C 内部,所以如果需要使用一次 python 包装的 c 函数,那么数据只是交给 C 进行计算,这似乎是一个很好的解决方案。我个人找不到有关执行此类操作的文档。

【问题讨论】:

  • 我猜答案是“不”。 Thr 问题宁愿是“你的计算是否正确编写”,也许是“如果你改用 numpy 会怎样”
  • 好点。这似乎很明显,但我最近做了很多优化,这使得这成为可能(我认为),所以这种方法在我的雷达下滑动

标签: python c python-3.x pandas cython


【解决方案1】:

有一种方法可以做到,但我不会将其描述为“简单”。

在内部,Pandas 使用 numpy 来存储数据。如果可以将数据作为 numpy 向量获取,则可以将其传递给 C,并让它对向量进行操作。

从列中获取 numpy 向量很容易:

vec = df["foo"].to_numpy()

接下来,您需要确保向量是连续的。你不能假设是这样,因为如果数据具有兼容的类型,pandas 会将来自多个列的数据存储在同一个 numpy 数组中。

vec = np.ascontiguousarray(vec) 

然后,您可以将 numpy 数组传递给 C,如 answer 中所述。这将适用于数值数据。如果你想使用字符串,那就更复杂了。

如果你走这条路,我建议阅读Pandas Under The Hood。它解释了许多重要的事情,比如为什么 numpy 数组不连续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2018-09-05
    • 1970-01-01
    • 2019-08-20
    • 2022-07-18
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多