【发布时间】: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 中使用它,以实现一些关于分类的研究。 -
我添加了一个现在并不真正需要的解决方案...