python-3.x - 来自另一个数据帧的 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 个角度。此外,有多个重复,因此您最终会得到很多角度和半径。
我需要能够仅过滤(保留)过滤器数据库中的半径和角度对。即,如果数据帧中的一行(角度和半径对)与过滤数据帧中的一行(角度和半径对)匹配,则保留该行。
过滤器数据框永远不会重复,主数据框会,这没关系。稍后,将针对匹配的行(角度和半径对)对未提及的其他列进行平均。
解决方案
我要添加一些东西到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
推荐阅读
- java - 在 Java 中使用正则表达式替换 yyyy-MM-dd 模式末尾的特定符号
- apache-spark - Spark迭代/递归算法 - 打破火花谱系
- python - 将upload_file 发送到电子邮件
- google-cloud-functions - firebase 服务功能未启动
- java - Swagger代码生成java,XML属性
- jdbi - 对 jdbi3 使用“选择更新”?
- android - libs 和 jniLibs 的 Android Studio 依赖问题
- html - 使用 Excel 文件更新 HTML
- electron - 如何在电子菜单中的一行上有多个标签
- r - 如何进行加入并仅从相关组中选择特定行?