根据其他数据框值python将值赋予数据框列

时间:2018-09-26 15:37:04

标签: python pandas dataframe

我有两个数据框。在第一个餐厅中,我有顾客,还有一个列,其中列出了他/她去过的每家餐厅。

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'

我试图不对客户数据框进行迭代,这花费了太长时间。有帮助吗?

2 个答案:

答案 0 :(得分:2)

旨在不使用熊猫系列中的列表。使用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

答案 1 :(得分:0)

我首先将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

值被嘲笑,因为在您提供的示例中,df_customers中没有您df_rest的餐厅ID。