首页 > 解决方案 > 在 Pyspark 和 Pandas 中映射具有实际间隔的字典作为键

问题描述

我很想得到pysparkpandas的答案。

我的方法:

假设simple_dict = {1:'A',2:'B',3:'C'}是字典。

在熊猫中:我们可以做到,

df['New_col'] = df['col'].map(simple_dict)

在 pyspark 中:

from itertools import chain

mapping_expr = create_map([lit(x) for x in chain(*simple_dict.items())])

df = df.withColumn('col1_map', mapping_expr[df['col1']])

但是,如果我有一个字典,其中的键为间隔,例如,

import intervals as I

dict_new = {I.closed(0,1):'A',I.openclosed(1,2):'B',I.openclosed(2,3):'C'} 

所以,我的 dict_new 是一个以实际间隔为键的字典,它看起来像这样:

print(dict_new)

{[0,1]: 'A', (1,2]: 'B', (2,3]: 'C'}

并且对于任何间隔,

i = I.closed(-1,1),
print(i) 

给出 [-1,1] 那么,如果我必须检查一个否。是否在这个区间内我可以输入:0.999 in i,输出:True

但是,如果我在 pandas 和 pyspark 中都有一个包含十进制值的列的数据框,并且我想使用该字典将该列值映射到一个新的类别列中,我该怎么做?

for k in di.keys():
    df['new']=df['No'].map(lambda x:di[k] if x in k else None)
df

以上方法无效!

您可以对字典中的键进行不同的构图,但我希望它们是真实的间隔,以便可以对任何真实的 no 进行分类。

这在 SAS 中非常简单:

new_col = format(col,dictionary)

标签: pythonpandasdataframedictionarypyspark

解决方案


推荐阅读