修改熊猫列而不更改基础的numpy数组

问题描述

我的目标:

我在C ++中有一个数据结构,该结构保存字符串(或更准确地说是多维char数组)。我希望通过Numpy和Pandas向Python公开此结构。最终目标是让用户修改一个数据框,该数据框实际上会修改底层的C ++数据结构。

到目前为止我已经完成的事情:

我用2D numpy数组包装了C ++数据结构(通过PyArray_New API调用),并将其返回到python中。然后,在python内部,我使用pandas.DataFrame(data=ndarray,columns=columns,copy=False)构造函数ndarray与pandas的数据框封装在一起,而不会复制任何数据

我还设法修改了单列。例如,我设法通过以下方式将字符串转换为小写:

tmp = df["Some_field"].str.decode('ascii').str.lower().str.encode('ascii')
df["Some_field"][:] = tmp

问题:

我现在正尝试将多列变成小写。我以为这很简单,但由于操作不会更改基础的numpy数组,因此我为此苦了一段时间。

我试图解决的问题:

fields_to_change = [...]
for field in fields:
        tmp = df[field].str.decode('ascii').str.lower().str.encode('ascii')
        df[field][:] = tmp

这将产生SettingWithcopyWarning,并且仅针对“ fields_to_change”中的第一个字段更改基础结构。

2。

fields_to_change = [...]
for field in fields:
        tmp = df[field].str.decode('ascii').str.lower().str.encode('ascii')
        df.loc[:,field] = tmp[:]

此程序运行时没有错误/警告,但是再次重申,基础数据没有更改。

3。

fields_to_change = [...]
for field in fields:
        tmp = df[field].str.decode('ascii').str.lower().str.encode('ascii')
        np.copyto(dst=df[field].values,src=tmp.values,casting='unsafe')

这可以完美工作并更改基础数据。但是,从不同的角度来看,此代码是有问题的。重点是公开熊猫功能以透明地修改基础数据。我可以将用户操纵的数据框中的所有值复制到保存基础数据的数组中,但这会严重降低我的程序的速度。

TLDR;我的问题是:

如何在不更改构成数据帧的基础numpy数组的情况下使用pandas处理某些列中的字符串?另外,有没有办法确保用户不能更改基础的numpy数组?

非常感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)