Многострочная фильтрация Python DataFrame с другого датафрейма - PullRequest
0 голосов
/ 22 мая 2018
  • Отредактировано для уточнения

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

0 голосов
/ 22 мая 2018

Я собираюсь добавить кое-что к 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
0 голосов
/ 22 мая 2018

Вы можете присоединиться к обоим DataFrames, а затем удалить дубликаты столбцов:

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)
...