#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. Спасибо, очень полезно!