Python DataFrame 多行过滤来自另一个 Dataframe

Python DataFrame Multi Line Filtering from Another Dataframe

我有一个大数据框。其中两列有 ['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 个角度。此外,还有多次重复,所以你最终会得到很多角度和半径。

我需要能够从过滤器数据库中仅过滤(保留)半径和角度对。即,如果数据框中的一行(角度和半径对)与过滤器数据框中的一行(角度和半径对)匹配,则保留该行。

过滤器数据帧永远不会有重复,主数据帧会有,这没关系。稍后未提及的其他列将针对匹配行(角度和半径对)进行平均。

您可以连接两个 DataFrame,然后删除重复的列:

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)

我要添加一些内容到 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