Фильтрация многоканальная линия питона таблицы данных из другой таблицы данных
- отредактировано для уточнения
У меня есть большой фрейм данных. В двух столбцах есть ['radius']
и ['angle']
.
У меня есть другой фрейм данных фильтра, который имеет только ['radius']
и ['angle']
.
Этот код предназначался для удаления строк, которые не имели совпадения по углу и радиусу из фрейма данных фильтра. Он видит все радиусы и углы, поэтому ничего не роняет:
df = df.drop(~df['angle'] == filter_df[angle] & ~df['radius'] == filter_df['radius'])
df = df.drop(~df['angle'].isin(filter_df[angle]) & ~df['radius'].isin(filter_df['radius']))
Как выглядят фреймы данных:
# Filter dataframe: # Main dataframe
angle radius angle radius ...
0 0 500 0 0 500 ...
1 0 1000 1 0 1000 ...
2 0 1500 2 0 1500 ...
3 45 500 3 0 2000 ...
4 45 1000 4 0 2500 ...
5 45 1500 5 0 3000 ...
6 45 2000 6 0 3500 ...
7 45 2500 7 0 4000 ...
8 45 3000 8 0 4500 ...
9 90 500 9 0 5000 ...
10 90 1000 11 45 500 ...
11 135 2000 12 45 1000 ...
12 135 2500 13 45 1500 ...
... ...
45 315 2000 719 315 7000
Основной кадр данных имеет 10 радиусов на угол и 8 англы. Кроме того, есть несколько повторов, так что вы в конечном итоге с большим количеством углов и радиусов.
Мне нужно иметь возможность фильтровать (сохранять) только пары радиусов и углов из базы данных фильтров. т. е. если строка (пара угол и радиус) из фрейма данных совпадает со строкой (пара угол и радиус) из фрейма данных фильтра, сохраните эту строку.
Кадр данных фильтра никогда не будет иметь повторов, основной кадр данных будет, что нормально. Позже другие столбцы, не упомянутые выше, будут усреднены для сопоставления. ряды (пары углов и радиусов).
2 ответа:
Я собираюсь добавить кое-что к
main_df
main_df = main_df.assign(A=1, B=2, C=3) main_df angle radius A B C 0 0 500 1 2 3 1 0 1000 1 2 3 2 0 1500 1 2 3 3 0 2000 1 2 3 4 0 2500 1 2 3 5 0 3000 1 2 3 6 0 3500 1 2 3 7 0 4000 1 2 3 8 0 4500 1 2 3 9 0 5000 1 2 3 11 45 500 1 2 3 12 45 1000 1 2 3 13 45 1500 1 2 3 719 315 7000 1 2 3
Теперь, поскольку
filtered_df
имеет только два столбца иmerge
автоматически выбирает общие столбцы, аhow
по умолчанию имеет значение'inner'
:main_df.merge(filtered_df) angle radius A B C 0 0 500 1 2 3 1 0 1000 1 2 3 2 0 1500 1 2 3 3 45 500 1 2 3 4 45 1000 1 2 3 5 45 1500 1 2 3
Вы можете соединить оба фрейма данных, а затем удалить повторяющиеся столбцы:
filtered = df.join(df_filter, on=["angle", "radius"], how='inner', lsuffix='_orig') # angle_orig radius_orig angle radius #0 0 500 0 500 #1 0 1000 0 1000 #2 0 1500 0 1500 #3 45 500 0 2000 #4 45 1000 0 2500 #5 45 1500 0 3000 #6 45 2000 0 4000 #7 45 2500 0 5000 #8 45 3000 0 6000 #9 90 500 0 7000 #10 90 1000 45 500 #11 135 2000 45 1000 #12 135 2500 45 1500 filtered.drop(["angle_orig", "radius_orig"], inplace=True)