Выбор строк, соответствующих столбцу в другом фрейме данных

#python #pandas

Вопрос:

У меня есть 2 кадра данных df_Participants и df_Movements, и я хочу сохранить строки df_Movements только в том случае, если участник включен df_Participants .

Df_участники:

          id                          
0    1053.0     
1    1052.0  
2    1049.0  
 

df_движения

      id           participant                    
0    3902         1053                   
1    3901         1053                                  
611  2763          979                   
612  2762          979                   

 

Ожидаемые результаты:

      id           participant                    
0    3902         1053                   
1    3901         1053   
 

то, что я пробовал до сих пор:

 remove_incomplete_submissions = True
if remove_incomplete_submissions:

    df_Movements = df_Movements.loc[df_Movements['participant'].isin(df_Participants['id'])]

 

Когда я проверяю количество уникальных участников, оно не совпадает. Я знаю, что это просто, но я, кажется, не замечаю здесь проблемы.

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

1. использование isin — хороший способ попасть туда, и то, что вы сделали, кажется правильным. Что вы подразумеваете под тем, что количество уникальных участников не совпадает ?

2. @Ben. — Я раньше не видел вашего предложения. Я добавил вас в свой ответ.

3. Я ожидаю 40 уникальных участников, но я продолжаю получать 28 (также я уверен, что есть 40 уникальных участников).

4. Моя ошибка заключалась в том, что я сохранял изменения в исходном CSV-файле каждый раз, когда запускал скрипт. Следовательно, я так и не получил соответствующий номер.

5. @Corralien нет pb, если я не потратил время на написание ответа, но это сделал кто-то другой, то я не могу на самом деле злиться :p но в этом случае ОП уже написал этот метод isin в показанном коде. поэтому я был еще больше сбит с толку тем, почему это не сработало в их случае

Ответ №1:

Вы можете использовать слияние:

 new_df = df_Participants.merge(df_Movements, how='left', left_on='id', right_on='participant')
 

Ответ №2:

Используется isin для создания логической маски и получения строк, соответствующих условию:

 >>> df_Movements[df_Movements['participant'].isin(df_Participants['id'])]

     id  participant
0  3902         1053
1  3901         1053
 

Редактировать: как и предлагал @Ben.T в комментариях