Используйте boolean indexing
и фильтруйте по DataFrame.isin
только выбранные столбцы в списке и проверяйте оба значения True
с по строкам по DataFrame.all
:
df1 = df[df[['Start','End']].isin(start_end_list).all(axis=1)]
Другая идея заключается в тестировании обоих столбцов отдельно по Series.isin
и цепных масок по &
для побитового AND
:
df1 = df[df['Start'].isin(start_end_list) & df['End'].isin(start_end_list)]
print (df1)
Start End Distance
0 A B 10
1 A C 11
3 B C 13
Detail1 :
print (df[['Start','End']].isin(start_end_list))
Start End
0 True True
1 True True
2 True False
3 True True
4 True False
5 True False
print (df[['Start','End']].isin(start_end_list).all(axis=1))
0 True
1 True
2 False
3 True
4 False
5 False
dtype: bool
Detail2:
print (df['Start'].isin(start_end_list))
0 True
1 True
2 True
3 True
4 True
5 True
Name: Start, dtype: bool
print (df['End'].isin(start_end_list))
0 True
1 True
2 False
3 True
4 False
5 False
Name: End, dtype: bool
print (df['Start'].isin(start_end_list) & df['End'].isin(start_end_list))
0 True
1 True
2 False
3 True
4 False
5 False
dtype: bool
РЕДАКТИРОВАТЬ: Для повторяющихся строк добавить concat
с DataFrame.sort_index
только стабильным al go mergesort
и последним индексом создания по умолчанию на DataFrame.reset_index
с drop=True
df2 = pd.concat([df1, df1]).sort_index(kind='mergesort').reset_index(drop=True)
print (df2)
Start End Distance
0 A B 10
1 A B 10
2 A C 11
3 A C 11
4 B C 13
5 B C 13