这是我的DataFrame:

import pandas as pd 
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]
    }
)

预期输出:df × c,条件是:

     a  b   c
0   10  1  25
1   15  1  25
2   20  1  25
3   25 -1  45
4   30 -1  45
5   35 -1  45
6   40 -1  45
11  65 -1  40
12  70 -1  40

流程如下:

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

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

例如:

第25组被选中.

(2)有三种情况.前两组:第45组和第40组.

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

我想要的组如下所示:

enter image description here

以下是我的try ,非常接近:

df1 = df.groupby('c').filter(lambda g: g.b.eq(1).all())
gb = df.groupby('c')
new_gb = pd.concat([gb.get_group(group) for i, group in enumerate(gb.groups) if i < 2])

推荐答案

您可以使用自定义掩码boolean indexing:

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

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

或者,对于没有groupby的变体,使用set操作:

# identify rows with 1/-1
m1 = df['b'].eq(1)
m2 = df['b'].eq(-1)

# drop c that have values other that 1/-1:  {65}
# drop -1 groups after 2nd occurrence:      {30}
drop = set(df.loc[~(m1|m2), 'c']) | set(df.loc[m2, 'c'].unique()[2:])

out = df[~df['c'].isin(drop)]

输出:

     a  b   c
0   10  1  25
1   15  1  25
2   20  1  25
3   25 -1  45
4   30 -1  45
5   35 -1  45
6   40 -1  45
11  65 -1  40
12  70 -1  40

中间体(第一种方法):

     a  b   c     m1     m2     m3
0   10  1  25   True  False  False
1   15  1  25   True  False  False
2   20  1  25   True  False  False
3   25 -1  45  False   True   True
4   30 -1  45  False   True   True
5   35 -1  45  False   True   True
6   40 -1  45  False   True   True
7   45  2  65  False  False  False
8   50  2  65  False  False  False
9   55  2  65  False  False  False
10  60  2  65  False  False  False
11  65 -1  40  False   True   True
12  70 -1  40  False   True   True
13  10 -1  30  False   True  False
14  22 -1  30  False   True  False

中间体(第二种方法):

     a  b   c     m1     m2  ~isin(drop)
0   10  1  25   True  False         True
1   15  1  25   True  False         True
2   20  1  25   True  False         True
3   25 -1  45  False   True         True
4   30 -1  45  False   True         True
5   35 -1  45  False   True         True
6   40 -1  45  False   True         True
7   45  2  65  False  False        False
8   50  2  65  False  False        False
9   55  2  65  False  False        False
10  60  2  65  False  False        False
11  65 -1  40  False   True         True
12  70 -1  40  False   True         True
13  10 -1  30  False   True        False
14  22 -1  30  False   True        False

Python相关问答推荐

在Python中对分层父/子列表进行排序

对Numpy函数进行载体化

Pandas 在最近的日期合并,考虑到破产

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

查找两极rame中组之间的所有差异

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

如何在达到end_time时自动将状态字段从1更改为0

如何在Pyplot表中舍入值

寻找Regex模式返回与我当前函数类似的结果

从列表中获取n个元素,其中list [i][0]== value''

基于Scipy插值法的三次样条系数

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

如何按row_id/row_number过滤数据帧

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

Django在一个不是ForeignKey的字段上加入'

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子

如何通过特定导入在类中执行Python代码

将Pandas DataFrame中的列名的长文本打断/换行为_STRING输出?