首页 > 解决方案 > 根据其他数据框值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'

我试图不迭代我的客户数据框,这需要太长时间。有什么帮助吗?

标签: pythonpandasdataframe

解决方案


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

推荐阅读