这是一个后续的post

这是我的DataFrame:

df = pd.DataFrame(
    {
        'a': [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 10, 22],
        'b': [1, 1, 1, -1, -1, -1, -1, 2, 2, 2, 2, -1, -1, -1, -1],
        'c': [25, 25, 25, 45, 45, 45, 45, 65, 65, 65, 65, 40, 40, 30, 30],
        'main': ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y']
    }
)

预期输出:mainc组:

    a  b   c main
0   10  1  25    x
1   15  1  25    x
2   20  1  25    x
3   25 -1  45    x
4   30 -1  45    x
5   35 -1  45    x
6   40 -1  45    x
11  65 -1  40    y
12  70 -1  40    y
13  10 -1  30    y
14  22 -1  30    y

过程如下:注意,groupby由两列完成:

main个:

a) Select 所有b个值为1的组.在我的数据和这df中,只有一个群体有这种情况.

b) Select 前两组(从df的顶部开始),它们的b值都是—1.

请注意,在我的数据中有一种可能性,即没有组具有ab条件.如果是这样的话,返回符合条件的任何内容都可以.例如,输出可能只有一个组或根本没有组.

我想要的组如下所示:

enter image description here

这是我基于这answer的try ,但似乎还有一些东西必须改变:

# identify groups with all 1
m1 = df['b'].eq(1).groupby(df['c', 'main']).transform('all')
# identify groups with all -1
m2 = df['b'].eq(-1).groupby(df['c', 'main']).transform('all')
# keep rows of first 2 groups with all -1
m3 = df[['c', 'main']].isin(df.loc[m2, ['c', 'main']].unique()[:2])

# select m1 OR m3
out = df[m1 | m3]

推荐答案

你可以更新前面的代码,以获得每个main的前2个唯一的"c":

groups = [df['c'], df['main']]
# identify groups with all 1
m1 = df['b'].eq(1).groupby(groups).transform('all')
# identify groups with all -1
m2 = df['b'].eq(-1).groupby(groups).transform('all')
# keep rows of first 2 groups with all -1, per main
keep = set.union(*df.loc[m2, ['c', 'main']].groupby('main')['c']
                    .agg(lambda x: set(x.unique()[:2])))
# {25}
m3 = df['c'].isin(keep)

# select m1 OR m3
out = df[m1 | m3]

或者使用merge,但这不一定保持行的原始顺序:

groups = [df['c'], df['main']]
# identify groups with all 1
m1 = df['b'].eq(1).groupby(groups).transform('all')
# identify groups with all -1
m2 = df['b'].eq(-1).groupby(groups).transform('all')
# keep rows of first 2 groups with all -1, per main
ref = df.loc[m2, ['c', 'main']].drop_duplicates().groupby('main').head(2)

out = pd.concat([df[m1], df.merge(ref)], ignore_index=True)

输出:

     a  b   c main
0   10  1  25    x
1   15  1  25    x
2   20  1  25    x
3   25 -1  45    x
4   30 -1  45    x
5   35 -1  45    x
6   40 -1  45    x
11  65 -1  40    y
12  70 -1  40    y
13  10 -1  30    y
14  22 -1  30    y

Python相关问答推荐

在Python和matlab中显示不同 colored颜色 的图像

理解Python的二分库:澄清bisect_left的使用

从收件箱中的列中删除html格式

有症状地 destruct 了Python中的regex?

海运图:调整行和列标签

为什么符号没有按顺序添加?

如何让程序打印新段落上的每一行?

有没有一种方法可以从python的pussompy比较结果中提取文本?

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

海上重叠直方图

在ubuntu上安装dlib时出错

在两极中过滤

Pandas:计算中间时间条目的总时间增量

如何创建引用列表并分配值的Systemrame列

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

PYTHON中的pd.wide_to_long比较慢

将像素信息写入文件并读取该文件

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

.awk文件可以使用子进程执行吗?

如何在基于时间的数据帧中添加计算值