Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代df列列表并使用字典中的值替换现有键_Python_Pandas_Dataframe_Dictionary_Processing Efficiency - Fatal编程技术网

Python 迭代df列列表并使用字典中的值替换现有键

Python 迭代df列列表并使用字典中的值替换现有键,python,pandas,dataframe,dictionary,processing-efficiency,Python,Pandas,Dataframe,Dictionary,Processing Efficiency,我有一份关于概率的记录。 我有一个500万行的df,看起来是这样的: user_id item_list U1 [I1,I3,I4] U2 [I5,I4] user_id item_list prob_list U1 [I1,I3,I4] [0.1,0.4] U2 [I5,I4] [0.4] 还有一句话:{'I1':0.1,'I4':0.4,…} 我试着去每一行并创建一个带有概率的列表,如下所示: us

我有一份关于概率的记录。 我有一个500万行的df,看起来是这样的:

user_id   item_list
 U1       [I1,I3,I4]
 U2       [I5,I4]
user_id   item_list     prob_list
 U1       [I1,I3,I4]    [0.1,0.4]
 U2       [I5,I4]       [0.4]
还有一句话:
{'I1':0.1,'I4':0.4,…}

我试着去每一行并创建一个带有概率的列表,如下所示:

user_id   item_list
 U1       [I1,I3,I4]
 U2       [I5,I4]
user_id   item_list     prob_list
 U1       [I1,I3,I4]    [0.1,0.4]
 U2       [I5,I4]       [0.4]
  • 并非所有项目都有概率
这是我的代码:

keys = list(prob_dict.keys())
df['prob_list'] = df.progress_apply(lambda x: get_probability(prob_dict=prob_dict,
keys=keys, item_list=x['item_list']),axis=1)

def get_probability(prob_dict, keys, item_list):


    prob_list = []
    for item in item_list:
        if item  in keys:
           prob = prob_dict[item ]
           prob_list.append(prob)

    if len(prob_list)>=1:
        return prob_list
    else:
        return np.nan
因为我使用的是TQM,所以我知道它需要多长时间(120小时),这太多了,而且显然没有效率

有没有关于如何更有效地执行此操作的想法?

使用,将
项目列表中的每个项目转换为熊猫系列,并相应地将此系列映射到映射词典
d
,然后使用
dropna
删除
NaN
值:

d = {'I1': 0.1, 'I4': 0.4}

df['prob_list'] = (
    df['item_list'].transform(lambda s: pd.Series(s).map(d).dropna().values)
)

更新(使用
多处理
提高将
项目列表
映射到
问题列表
的速度):

结果:

# print(df)
  uer_id     item_list   prob_list
0     U1  [I1, I3, I4]  [0.1, 0.4]
1     U2      [I5, I4]       [0.4]

谢谢,我会试试的,字典中没有的项目也算吗?是的,算了,字典中没有的项目不会出现在输出中。@anat检查更新的答案,我做了一些更改。我只是在5.6M中的100行上进行了尝试,几分钟后还没有完成。@anat在
item_list
列中添加了条件来解释NaN值。