首页 > 解决方案 > 来自另一个数据帧的 Python 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 个角度。此外,有多个重复,因此您最终会得到很多角度和半径。

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

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

标签: python-3.xpandasdataframefilteringtwo-columns

解决方案


我要添加一些东西到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

推荐阅读