pandas - 如何根据对应于包含每个 ID 条件的第二个 Dataframe 的 ID 列有效地过滤 Dataframe?
问题描述
我有一个数据框,其中包含一个 ID 列和两个包含数值的数据列 X、Y。每个 ID 都有几行数据。
我有第二个数据框,它具有相同的 ID 列和两个数字列,指定 X 的下限和上限 - 每个 ID 的值。
我想使用第二个数据框来过滤第一个数据框,使其只有在特定 ID 的 X_min-X_max 范围内具有 X 值的行。
我可以通过遍历第二个数据帧并过滤 groupby(ID) - 第一个 DF 的元素来解决这个问题,但对于大量 ID 来说这很慢。有没有有效的方法来解决这个问题?
具有 df 中的数据、df_ranges 中的范围和 df_result 中的预期结果的示例代码。真实的数据帧显然要大得多。
import pandas as pd
x=[2.1,2.2,2.6,2.4,2.8,3.5,2.8,3.2]
y=[3.1,3.5,3.4,2.7,2.1,2.7,4.1,4.3]
ID=[0]*4+[0.1]*4
x_min=[2.0,3.0]
x_max=[2.5,3.4]
IDs=[0,0.1]
df=pd.DataFrame({'ID':ID,'X':x,'Y':y})
df_ranges=pd.DataFrame({'ID':IDs,'X_min':x_min,'X_max':x_max})
df_result=df.iloc[[0,1,3,7],:]
可能的解决方案:
def filter_ranges(grp,df_ranges):
x_min=df_ranges.loc[df_ranges.ID==grp.name,'X_min'].values[0]
x_max=df_ranges.loc[df_ranges.ID==grp.name,'X_max'].values[0]
return grp.loc[(grp.X>=x_min)&(grp.X<=x_max),:]
target_df_grp=df.groupby('ID').apply(filter_ranges,df_ranges=df_ranges)
解决方案
尝试这个:
merged = df.merge(df_ranges, on='ID')
target_df = merged[(merged.X>=merged.X_min)&(merged.X<=merged.X_max)][['ID', 'X', 'Y']] # Here, desired filter is applied.
print(target_df)
会给:
ID X Y
0 0.0 2.1 3.1
1 0.0 2.2 3.5
3 0.0 2.4 2.7
7 0.1 3.2 4.3
推荐阅读
- python - 有什么方法可以在不更改 python 中的 dtype 的情况下转换数据框中的日期时间格式
- asp.net - 由于来自 IIS ASP.NET 网站的非法 URL,事件查看器向事件 1309 (HttpException) 发送垃圾邮件
- c# - 如何在循环 C# 中插入列表时提高性能
- arrays - 值列表上的计算字段
- javascript - 了解 http 请求如何在 Mocha 上工作
- sql-server - 获取权限错误和“功能不存在”错误
- perl - 如何在 Perl 中使用 mkdir 创建文件夹?
- c++ - 为什么我的代码在输出中添加了 93 天?
- google-cloud-platform - Google Cloud Vision - 如何检查包含上传的原始图像或处理请求结果的日志
- powershell - 通过 powershell 格式化 json