根据其他数据框值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'

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


偶然的你
浏览 369回答 2
2回答

炎炎设计

旨在不使用 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  score0         1  [20504916171, 20504916171, 20499859164]      51         2               [20505918674, 20505918674]      4

哈士奇WWW

我首先将其扩展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    Restaurants0   000000984   205049161711   000000984   205049161712   000000984   204998591643   000010076   205059186744   000010076   205059186745   000010076   205059186746   000010319   202533467117   000010319   20524403863然后 mapdf3['Point'] = df3.Restaurants.map(df_rest.set_index('Restaurant').Points).fillna(0)        Document    Restaurants Point0   000000984a  20504916171     11   000000984a  20504916171     12   000000984a  20499859164     03   000010076a  20505918674     04   000010076a  20505918674     05   000010076a  20505918674     0然后groupby文档和sumdf3.groupby('Document').sum()             Restaurants PointDocument        000000984   61509691506 2.0000010076   61517756022 0.0000010319   61285997251 0.0000018468   61297721611 0.0值被嘲笑,因为从没有餐厅的IDdf_customers存在于你df_rest在你所提供的例子。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python