python - 根据其他数据框值python为数据框列赋予价值
问题描述
我有两个数据框。在第一个中,我有客户和一个列,其中列出了他/她访问过的每家餐厅。
In [1]: df_customers
Out[1]:
Document Restaurants
0 '000000984 [20504916171, 20504916171, 20499859164]
1 '000010076 [20505918674, 20505918674, 20505918674]
2 '000010319 [20253346711, 20524403863, 20508246677]
3 '000018468 [20253346711, 20538456226, 20505918674]
4 '000024409 [20553255881, 20553596441, 20553255881]
5 '000025944 [20492255719, 20600654226]
6 '000031162 [20600351398, 20408462399, 20499859164]
7 '000055177 [20524403863, 20524403863]
8 '000058303 [20600997239, 20524403863, 20600997239]
9 '000074791 [20517920178, 20517920178, 20517920178]
在我的另一个数据框中,我有一列包含餐厅,另一列包含给定值
In [2]: df_rest
Out [2]:
Restaurant Points
0 10026575473 1
1 10037003331 1
2 10072208299 1
3 10179698400 2
4 10214262750 1
我需要在我的客户数据框中创建一个列,其中包含他/她访问过的每家餐厅的积分总和。
我试过这样的事情:
df_customers["Sum"]=df_rest.loc[df_rest["Restaurant"].isin(df_customers["Restaurants"]),"Points"].sum()
但我收到了这个错误:
TypeError: unhashable type: 'list'
我试图不迭代我的客户数据框,这需要太长时间。有什么帮助吗?
解决方案
旨在不使用 Pandas 系列中的列表。使用list
消除了矢量化操作的可能性。更有效的是将您的餐厅列表的锯齿状数组扩展为单个数据帧,然后通过字典和求和映射到点。
这是一个最小的例子:
df1 = pd.DataFrame({'Document': [1, 2],
'Restaurants': [[20504916171, 20504916171, 20499859164],
[20505918674, 20505918674]]})
df2 = pd.DataFrame({'Restaurant': [20504916171, 20504916171, 20499859164,
20505918674, 20505918674],
'Points': [1, 2, 1, 3, 2]})
ratmap = df2.set_index('Restaurant')['Points'].to_dict()
df1['score'] = pd.DataFrame(df1['Restaurants'].values.tolist())\
.applymap(ratmap.get).fillna(0).sum(1).astype(int)
print(df1)
Document Restaurants score
0 1 [20504916171, 20504916171, 20499859164] 5
1 2 [20505918674, 20505918674] 4
推荐阅读
- python - 无法为 Deepspeech 运行麦克风 VAD 流
- python - 熊猫以非固定周期移动行
- eclipse - Eclipse 4.14 的 SVN 插件
- ionic-framework - Ionic/Angular 5.0.1 global.scss 注释掉了,我该如何应用到我的应用程序?
- python - Jinja2 未正确显示在网页中
- powershell - 设置路径参数失败
- javascript - bootstrap-vue:b-form-datepicker 在悬停之前不会更新到 v-model
- c# - 检查触摸区域时触摸很慢
- node.js - 找不到参考错误问题来自哪里
- vue.js - 使用 vue 框架部署 Web 应用程序