Python 迭代df列列表并使用字典中的值替换现有键
我有一份关于概率的记录。 我有一个500万行的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
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值。