Фильтрация многоканальная линия питона таблицы данных из другой таблицы данных


  • отредактировано для уточнения

У меня есть большой фрейм данных. В двух столбцах есть ['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 2

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)