pandas - 通过三列的组合过滤前 n 个值

标签 pandas

我有一个排序的数据框,有 4 列,如下所示。我正在尝试过滤我的数据帧,以便对于 (Var1, Var2, Var3) 的每个组合,我为 Var4 保留 2 个第一个明确值。 例如,我的数据框中的 (Var1, Var2, Var3) 的第一个组合是 (A, B, C)。该组合的前两个不同值是 value_1 和 value_2。 (Var1, Var2, Var3) 的第二个组合是 (A, C, C)。对于这个组合,我只有一种类型的值,即 value_14。 等等...

输入:

       Var1  Var2  Var3  Var4
    1     A    B      C  value_1
    2     A    B      C  value_1
    3     A    B      C  value_1
    4     A    B      C  value_1
    5     A    B      C  value_2
    6     A    B      C  value_2
    7     A    B      C  value_3
    8     A    B      C  value_3
    9     A    B      C  value_3
    10    A    B      C  value_4
   11     A    C      C  value_14
   12     A    C      C  value_14
   13     A    C      C  value_14
   14     A    C      C  value_14
   15     B    B      C  value_21
   16     B    B      C  value_21
   17     B    B      C  value_32
   18     B    B      C  value_32
   19     B    B      C  value_33
   20     B    B      C  value_43

输出:

       Var1  Var2  Var3  Var4
    1     A    B      C  value_1
    2     A    B      C  value_1
    3     A    B      C  value_1
    4     A    B      C  value_1
    5     A    B      C  value_2
    6     A    B      C  value_2
   11     A    C      C  value_14
   12     A    C      C  value_14
   13     A    C      C  value_14
   14     A    C      C  value_14
   15     B    B      C  value_21
   16     B    B      C  value_21
   17     B    B      C  value_32
   18     B    B      C  value_32

请注意,我的数据框有 500 万行。到目前为止,我已经找到了使用循环的解决方案,但需要将近一个小时。

最佳答案

我们可以使用

df[df.groupby(['Var1','Var2','Var3'])['Var4'].apply(lambda x : x.groupby(x).ngroup()<2)]

Out[106]: 
   Var1 Var2 Var3      Var4
1     A    B    C   value_1
2     A    B    C   value_1
3     A    B    C   value_1
4     A    B    C   value_1
5     A    B    C   value_2
6     A    B    C   value_2
11    A    C    C  value_14
12    A    C    C  value_14
13    A    C    C  value_14
14    A    C    C  value_14
15    B    B    C  value_21
16    B    B    C  value_21
17    B    B    C  value_32
18    B    B    C  value_32

关于pandas - 通过三列的组合过滤前 n 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58170180/

相关文章:

python - 提取csv列中特殊字符之间的字符串

python del 没有释放所有内存

python - 将零/南行添加到 pandas python 中的不连续索引

python - pandas - 计算列中值的使用

Python 计算特定列的相同值

python - 在多列上使用 Pandas df.where 会产生意外的 NaN 值

python - DataFrame 来自多个字典的列表,其中键是索引,值是列数据

python groupby 然后一些列先保留其他列最后

python - Pandas - 在同一列中格式化不同格式的日期列

python - Pandas:以 10 分钟为间隔绘制时间直方图