如何将参数包含到掩码或 Koalas 数据框中的 where 函数中
how to include a parameter into a mask or where function in a Koalas dataframe
我在 Azure 数据块中有一个 Koalas 数据框 运行,假设:
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.
这很奇怪,因为我没有在任何地方打电话给 Pandas
我也试过了:
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
我找到了解决此问题的方法,但我仍然不清楚原因。
就我而言,我要执行两个步骤。首先是重置过滤参数数据帧的索引。
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
希望这有用。
如果谁有更好的解决方案and/or请说明post。
我在 Azure 数据块中有一个 Koalas 数据框 运行,假设:
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.
这很奇怪,因为我没有在任何地方打电话给 Pandas
我也试过了:
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
我找到了解决此问题的方法,但我仍然不清楚原因。
就我而言,我要执行两个步骤。首先是重置过滤参数数据帧的索引。
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
希望这有用。 如果谁有更好的解决方案and/or请说明post。