熊猫屏蔽的数据框分配2D数组

时间:2019-09-23 13:59:55

标签: pandas numpy mask

我正在尝试解决带有数据框和掩码数组的难题。

上下文 我正在尝试提供一些方法来帮助我进行一些机器学习。我的目标是从一个简单的数据框向其中添加新信息。我希望这些功能易于使用。

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

这是一个谜,我想使用一个蒙版,因为没有这个蒙版,我将无法修改原始数据帧。如果删除此蒙版,如果数据框和要素的行数相同,则一切正常。现在,如果我添加此蒙版,它似乎是逐行和尺寸不匹配的。 编辑:我忘了告诉'功能'对应于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)

那么输出将是:

行;数据;标签 ; PCA

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

感谢您的回答! 最好的问候

1 个答案:

答案 0 :(得分:0)

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

因此,我改变了我的第一个主张。这是最终版本:

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] = pd.Series(features.tolist()),而不是执行dataframe.loc [mask,out] = features.tolist()。通过系列赛,它可以毫无问题地适应。

感谢Ken Syme参与我的问题。