为了账号安全,请及时绑定邮箱和手机立即绑定

根据其他数据框值python为数据框列赋值

根据其他数据框值python为数据框列赋值

偶然的你 2021-06-20 17:01:18
我有两个数据框。在第一个中,我有客户和列有他/她访问过的每家餐馆的列表。In [1]: df_customersOut[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_restOut [2]:   Restaurant     Points0  10026575473    11  10037003331    12  10072208299    13  10179698400    24  10214262750    1我需要在我的客户数据框中创建一列,其中包含他/她访问过的每家餐厅的积分总和。我试过这样的事情:df_customers["Sum"]=df_rest.loc[df_rest["Restaurant"].isin(df_customers["Restaurants"]),"Points"].sum()但我收到此错误:TypeError: unhashable type: 'list'我试图不迭代我的客户数据框,它需要太长时间。有什么帮助吗?
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

旨在不使用 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


查看完整回答
反对 回复 2021-06-29
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

我首先将其扩展df为:


d = {c: df_customers[c].values.repeat(df_customers.Restaurants.str.len(), axis=0) for c in df_customers.columns}

d['Restaurants'] = [i for sub in df_customers.Restaurants for i in sub]

df3 = pd.DataFrame(d)


    Document    Restaurants

0   000000984   20504916171

1   000000984   20504916171

2   000000984   20499859164

3   000010076   20505918674

4   000010076   20505918674

5   000010076   20505918674

6   000010319   20253346711

7   000010319   20524403863

然后 map


df3['Point'] = df3.Restaurants.map(df_rest.set_index('Restaurant').Points).fillna(0)    



    Document    Restaurants Point

0   000000984a  20504916171     1

1   000000984a  20504916171     1

2   000000984a  20499859164     0

3   000010076a  20505918674     0

4   000010076a  20505918674     0

5   000010076a  20505918674     0

然后groupby文档和sum


df3.groupby('Document').sum() 


            Restaurants Point

Document        

000000984   61509691506 2.0

000010076   61517756022 0.0

000010319   61285997251 0.0

000018468   61297721611 0.0

值被嘲笑,因为从没有餐厅的IDdf_customers存在于你df_rest在你所提供的例子。


查看完整回答
反对 回复 2021-06-29
  • 2 回答
  • 0 关注
  • 368 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信