Создание нового столбца на основе совпадающего значения 2 столбцов в кадре данных - PullRequest
0 голосов
/ 15 октября 2019

У меня есть 2 фрейма данных, с помощью которых мне нужно создать 3-й фрейм данных.

1-й фрейм данных выглядит следующим образом:

route_id   entity_id_1      
 r1           1                  
 r1           4          
 r1           5 

2-й фрейм данных выглядит следующим образом:

route_id    entity_id_2
  r1          4
  r1          7
  r1          8
  r1          9

Созданный 3-й кадр данных должен выглядеть следующим образом:

route id    compliance   
  r1           1/6

Объяснение:

Для конкретного route_id соответствие рассчитывается как (количество совпадающих значений /общее количество различных entity_ids)

Здесь, entity_1 в 1-м кадре данных и entity_2 во 2-м кадре данных совпадают.

no. из совпадающих значений = 1 ('4' - единственный entity_id, который присутствует в обоих фреймах данных для route_id 'r1')

общее число. различных идентификаторов entity_id, присутствующих в обоих кадрах данных = 6 (то есть 1,4,5,7,8,9 для route_id 'r1')

1 Ответ

0 голосов
/ 15 октября 2019

Попробуйте это:

df1=pd.DataFrame({'route_id':['r1','r1','r1'], 'entity_id_1':[1,4,5]})
df2=pd.DataFrame({'route_id':['r1','r1','r1','r1'], 'entity_id_1':[4,7,8,9]})

Предполагая пример данных в приведенном выше кадре данных, попробуйте ниже

target_df = df1.groupby('route_id').apply(lambda x: x.entity_id_1.isin(df2[df2.route_id==x.route_id.values[0]]['entity_id_1']).sum()/len(np.unique(x.entity_id_1.tolist()+df2[df2.route_id==x.route_id.values[0]]['entity_id_1'].tolist()))).reset_index(name='compliance')

Это даст желаемый результат, print(target_df):

route_id  compliance
0       r1    0.166667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...