Pandas 掩码数据框分配二维数组

Pandas masked dataframe assign 2D array

我正在尝试用数据框和屏蔽数组解决一个谜语。

上下文 我正在尝试制作一些方法来帮助我处理一些机器学习的东西。我的目标是从一个简单的数据框向其添加新信息。我希望这些功能简单易用。

问题 这是一个采用我所谓的模型的函数,可以从数据进行转换。然后,我想在新列或现有列上设置这些新数据。我没有使用 apply 函数,因为如果我这样做,我将失去使用并行性一次提取多个数据的能力(这就是为什么我先提取然后应用 'features'。

这是谜语,我想使用掩码,因为没有这个掩码我无法修改原始数据框。如果删除此掩码,如果数据框和功能具有相同的行数,则一切都很好。现在,如果我添加这个掩码,它似乎是逐行和维度不匹配.... 编辑:我忘了告诉 'features' 对应于 2d numpy 数组。

错误

ValueError:使用 ndarray

设置时必须具有相等的 len 键和值

代码

def transform(dataframe, tags, out, model, mask=None):
    # Check mandatory fields
    mandatory = ['datum']
    if not isinstance(tags, dict) or not all(elem in mandatory for elem in tags.keys()):
        raise Exception(f'Not a dict or missing tag: {mandatory}.')

    # Mask creation (see pandas view / copy mechanism)
    if mask is None:
        mask = [True] * len(dataframe.index)

    features = model.transform(dataframe.loc[mask, tags['datum']].to_numpy())
    dataframe.loc[mask, out] = features.tolist()
    return dataframe

例子 数据可以是这样的:

行;数据 ;标签

0; [61953.017837947686, 9.505037089204054, 74.585...] ;0

1; [80832.69302693632, 9.524642547991316, 83.9228...] ;1

模型可以是来自 sklearn 的 PCA。 该方法可能是这样的:

transform(dataframe, {'datum': 'Data'}, 'PCA', PCA(), mask=dataframe[dataframe['Label']==1)

那么输出将是:

行;数据 ;标签 ;主成分分析

0; [61953.017837947686, 9.505037089204054, 74.585...] ;0 ; [74.585...]

1; [80832.69302693632, 9.524642547991316, 83.9228...] ;1 ; [92.578...]

当前解

mask = inputs[condition]
inputs['PCA'] = np.nan
inputs[mask] = Classification.transform(inputs[mask], {'datum': 'Data'}, wavelet, 'PCA')

def transform(dataframe, tags, model, out):
    # Check mandatory fields
    mandatory = ['datum']
    if not isinstance(tags, dict) or not all(elem in mandatory for elem in tags.keys()):
        raise Exception(f'Not a dict or missing tag: {mandatory}.')

    features = model.transform(dataframe[tags['datum']].to_numpy())
    dataframe[out] = features.tolist()
    return dataframe

感谢解答! 最好的问候

好的,所以我找到了适合我需要的解决方案。 第二个想法对我来说是个坏主意,因为将视图作为参数传递并以方便的方式对其进行编辑似乎并不容易。

所以,我改变我的第一个命题。这是最终版本:

def transform(dataframe, tags, model, out, mask=None):
    # Check mandatory fields
    mandatory = ['datum']
    if not isinstance(tags, dict) or not all(elem in mandatory for elem in tags.keys()):
        raise Exception(f'Not a dict or missing tag: {mandatory}.')

    # Mask creation (see pandas view / copy mechanism)
    if mask is None:
        mask = [True] * len(dataframe.index)

    # dataframe[out] = np.nan
    features = model.transform(dataframe.loc[mask, tags['datum']].to_numpy())
    dataframe.loc[mask, out] = pd.Series(features.tolist())
    return dataframe

我没有做 dataframe.loc[mask, out] = features.tolist(),而是切换到:dataframe.loc[mask, out] = pd.Series(features.tolist()).通过一个系列,它适合没有任何问题。

感谢 Ken Syme 参与我的问题。