python - Pandas DataFrame 按多列标准和多个间隔过滤
问题描述
我已经检查了几个答案,但到目前为止没有发现运气。
我的数据集是这样的:
df = pd.DataFrame({
'Location':['A', 'A', 'A', 'B', 'C', 'C'],
'Place':[1, 2, 3, 4, 2, 3],
'Value1':[1, 1, 2, 3, 4, 5],
'Value2':[1, 1, 2, 3, 4, 5]
}, columns = ['Location','Place','Value1','Value2'])
Location Place Value1 Value2
A 1 1 1
A 2 1 1
A 3 2 2
B 4 3 3
C 2 4 4
C 3 5 5
我有一个间隔列表:
A: [0, 1]
A: [3, 5]
B: [1, 3]
C: [1, 4]
C: [6, 10]
现在我希望Location
与过滤器列表相等的每一行都应该在Place
过滤器的范围内。所以所需的输出将是:
Location Place Value1 Value2
A 1 1 1
A 3 2 2
C 2 4 4
C 3 5 5
我知道我可以通过 链接多个between
条件|
,但是我有一个非常长的间隔列表,因此手动输入条件是不可行的。我也考虑forloop
先对数据进行切片location
,但我认为可能有更有效的方法。
谢谢您的帮助。
编辑:目前间隔列表只是这样的字符串
A 0 1
A 3 5
B 1 3
C 1 4
C 6 10
但我想将它们切成字典列表。也欢迎更好的结构!
解决方案
先决条件:
# presumed setup for your intervals:
intervals = {
"A": [
[0, 1],
[3, 5],
],
"B": [
[1, 3],
],
"C": [
[1, 4],
[6, 10],
],
}
实际解决方案:
x = df["Location"].map(intervals).explode().str
l, r = x[0], x[1]
res = df["Place"].loc[l.index].between(l, r)
res = res.loc[res].index.unique()
res = df.loc[res]
输出:
>>> res
Location Place Value1 Value2
0 A 1 1 1
2 A 3 2 2
4 C 2 4 4
5 C 3 5 5
推荐阅读
- powershell - [System.Web.Security.Membership]::GeneratePassword() - 找不到类型
- c# - OnItemDataBound 将列表视图中的链接按钮注册到更新面板脚本管理器,但是,它们仅在第一次单击时起作用
- java - 具有相同存储库和实体的多个数据源
- database - 如何在 GDPR 下将用户名存储在数据库中?
- c - 比较频繁输入数据和存储 MAX 和 MIN 值的快速方法
- css - 即使删除了 margin 属性,元素仍然有边距
- jquery - Jquery Datepicker 输入
- python - Python3:仅将更新的 CSV 文件的新行添加到 MySQL 数据库
- jquery - 显示 Ajax 列表
- ios - iOS 分配给 BLE 设备的设备 UUID 是否随时间稳定?