【问题标题】:Pandas masked dataframe assign 2D array熊猫掩码数据框分配二维数组
【发布时间】:2019-09-24 23:16:14
【问题描述】:

我正在尝试用数据框和掩码数组解决一个谜。

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

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

这是谜语,我想使用掩码,因为没有这个掩码我无法修改原始数据框。如果删除此掩码,如果数据框和功能具有相同的行数,一切都很好。现在,如果我添加这个掩码,它似乎是逐行和尺寸不匹配的...... 编辑:我忘了告诉 '功能' 对应于 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

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

【问题讨论】:

  • 通过展示您将要进行的转换类型的真实示例,以及输入数据和预期输出,获得更多关于您在此处尝试执行的操作的示例会很棒
  • 我按照你的要求更新了 ;)
  • 你可以试试dataframe.loc[mask, [out]] = features.tolist()(注意额外的方括号)吗?如果这不起作用,打印 features.shape 的内容会有所帮助。出于兴趣,随后将其用于什么?想知道是否有更好的方法可以将您带到您需要的地方,
  • 感谢您的反应!所以对于dataframe.loc[mask, [out]] = features.tolist(),我得到“[Index(['PCA'], dtype='object')] are in the [columns]”对于你的第二个问题,features.shape 的维度为 (600 , 12) 并且数据框有 600 行。对于你的最后一个问题,我的主要目的是制作一个工具库,以最易读的方式在 jupyter notebook 中使用它,以实现一些关于分类的研究。
  • 我添加了一个现在并不真正需要的解决方案...

标签: pandas numpy mask


【解决方案1】:

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

所以,我改变了我的第一个提议。这是最终版本:

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 参与解决我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2019-12-20
    • 2019-05-03
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多