首页 > 解决方案 > 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

但我想将它们切成字典列表。也欢迎更好的结构!

标签: pythonpandas

解决方案


先决条件:

# 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

推荐阅读