0

我有一个在 Azure 数据块中运行的考拉数据框,可以说:

import databricks.koalas   as pd

df = pd.DataFrame({'category': ['A', 'A', 'B'],
                   'col1': [1, 2, 3],
                   'col2': [4, 5, 6]},
                  columns=['category', 'col1', 'col2'])

我想创建一个新列(当前在函数中),它根据列的值(有限且已知)评估列,并用来自另一个数据集列的元素填充新列。(为什么?,因为第二个数据集包含要包含的参数,并且在用于此数据提取之前已被过滤)

我已经尝试过(来自调用 df 和 params 的函数中的代码)

    return      df.assign(col3= df.category.map({
      'A': params['column1'] , 
      'B' : params['column2']  , 
      'C': params['column3']     
    #}) )

带有错误消息:

PandasNotImplementedError: The method `pd.Index.__iter__()` is not implemented. If you want to collect your data as an NumPy array, use 'to_numpy()' instead.

这很奇怪,因为我在任何地方都没有给熊猫打电话

我也试过:

    df = df.assign(col3 = None)

    return     df.col3.mask(df.category== 'A', params['column1']) \
                .mask(df.category == 'B' , params['column2'])\
                .mask(df.category == 'C', params['column3'])

在第二种情况下,返回的数据帧具有所有 nan 值。

我也已经将 'compute.ops_on_diff_frames' 设置为True

4

1 回答 1

0

我找到了解决此问题的方法,但我仍然不清楚原因。

就我而言,我正在做两个步骤。首先是重置过滤参数数据帧的索引。

params = orig_params.loc[*whatever filtering may fit here*].reset_index()

其次,只需使用我们想要的过滤元素。如果不使用此步骤,则屏蔽将要求您根据需要输入一个系列。在这里,我们只是将其转换为标量,例如:

    temp = df.category
    temp = temp.mask(temp == 'A', params['column1'][0]) \
      .mask(temp == 'B' , params['column2'][0])\
      .mask(temp == 'C', params['column3'][0])
    df1 = df.assign(col3 = temp)
    return df1

希望这是有用的。如果有人有更好的解决方案和/或解释,请发布。

于 2020-02-17T23:43:37.043 回答