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
- 编辑澄清
我有一个大数据框。其中两列有 ['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