Фрейм данных Pandas: столбец типа списка, созданный на основе сравнения двух фреймов данных

#python #pandas

#python #pandas

Вопрос:

Учитывая два фрейма данных ниже, где в df столбце USER представлены пользователь и ANTENNA_ID антенны, которые пользователи использовали для совершения телефонных звонков, а в df2 столбце USER также представлены пользователь и PRESUMED_RESIDENCE указывает антенну, ближайшую к дому пользователя:

 import pandas as pd
import numpy as np

df = pd.DataFrame({'USER':[1,2,3,1,1,2],
                   'ANTENNA_ID': ['SJDR1', 'LD', 'LD', 'LD', 'TR', 'SVM']})


df2 = pd.DataFrame({'USER': [1,2,3],
                    'PRESUMED_RESIDENCE': ['SJDR1', 'LD', 'LD']})
 

Мне нужно создать другой фрейм данных, содержащий USER столбец, PRESUMED_RESIDENCE df2 столбец of и другой столбец, содержащий местоположения, в которых пользователи совершали вызовы, отличные от их PRESUMED_RESIDENCE .

 USER | PRESUMED RESIDENCE  | CALL_LOC
  1  |        SJDR1        | LD, TR
  2  |         LD          | SVM
  3  |         LD          | Nan
 

то, что мне удалось представить до сих пор, далеко от ожидаемого результата, как видно ниже:

 df2['CALL_LOC'] = np.where(df.USER.values==df2.USER.values, df.ANTENNA_ID.values, np.nan)
df2
 

Кто-нибудь может помочь?

Ответ №1:

Если вы не заботитесь об удалении PRESUMED_RESIDENCE из списка CALL_LOC , в pandas это довольно просто.

 merged = pd.merge(df, df2, left_on="USER", right_on="USER")

print(merged.to_string())
>    USER ANTENNA_ID PRESUMED_RESIDENCE
0     1      SJDR1              SJDR1
1     1         LD              SJDR1
2     1         TR              SJDR1
3     2         LD                 LD
4     2        SVM                 LD
5     3         LD                 LD

grouped = merged.groupby("USER").agg(
    {"PRESUMED_RESIDENCE": min, "ANTENNA_ID": list}
)

print(grouped.to_string())

>      PRESUMED_RESIDENCE       ANTENNA_ID
USER                                    
1                 SJDR1  [SJDR1, LD, TR]
2                    LD        [LD, SVM]
3                    LD             [LD]
 

Вы также можете использовать в USER качестве индекса.

Если вы хотите удалить PRESUMED_RESIDENCE из ANTENNA_ID , вы можете сделать это в качестве второго шага, выполнив итерацию по строкам.

Если вы хотите сделать это во время построения pd.DataFrame, вы можете изменить каждую группу groupby объекта.

Комментарии:

1. Спасибо, очень полезно!