这是一个后续的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']
}
)
预期输出:main
和c
组:
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.
请注意,在我的数据中有一种可能性,即没有组具有a
或b
条件.如果是这样的话,返回符合条件的任何内容都可以.例如,输出可能只有一个组或根本没有组.
我想要的组如下所示:
这是我基于这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]