繁体   English   中英

Pandas DataFrame 按多列条件和多区间过滤

[英]Pandas DataFrame filter by multiple column criterias and multiple intervals

我已经检查了几个答案,但到目前为止没有发现运气。

我的数据集是这样的:

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器的范围内。 所以所需的 output 将是:

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

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

首先定义 dataframe df和过滤器dff

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'])


dff = pd.DataFrame({'Location':['A','A','B','C','C'], 
                    'fPlace':[[0,1], [3, 5], [1, 3], [1, 4], [6, 10]]})


dff[['p1', 'p2']] = pd.DataFrame(dff["fPlace"].to_list())

现在dff是:

  Location   fPlace  p1  p2
0        A   [0, 1]   0   1
1        A   [3, 5]   3   5
2        B   [1, 3]   1   3
3        C   [1, 4]   1   4
4        C  [6, 10]   6  10

其中fPlace转换为上下界p1p2表示应该应用于Place的过滤器。 下一个:

df.merge(dff).query('Place >= p1 and Place <= p2').drop(columns = ['fPlace','p1','p2'])

结果:

  Location  Place  Value1  Value2
0        A      1       1       1
5        A      3       2       2
7        C      2       4       4
9        C      3       5       5

先决条件:

# 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM