Python:在分组数据帧后单独对组使用apply

Python:在分组数据帧后单独对组使用apply,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我的数据框如下所示: ┌────┬──────┬──────┐ │ No │ col1 │ col2 │ ├────┼──────┼──────┤ │ 1 │ A │ 5.0 │ │ 1 │ B1 │ 10.0 │ │ 1 │ B2 │ 20.0 │ │ 2 │ A │ 0.0 │ │ 2 │ B1 │ 0.0 │ │ 2 │ C1 │ 0.0 │ │ 3 │ A │ 0.0 │ │ 3 │ B1 │ 5.0 │ │ 3 │ C

我的数据框如下所示:

┌────┬──────┬──────┐
│ No │ col1 │ col2 │
├────┼──────┼──────┤
│  1 │ A    │  5.0 │
│  1 │ B1   │ 10.0 │
│  1 │ B2   │ 20.0 │
│  2 │ A    │  0.0 │
│  2 │ B1   │  0.0 │
│  2 │ C1   │  0.0 │
│  3 │ A    │  0.0 │
│  3 │ B1   │  5.0 │
│  3 │ C1   │ 20.0 │
│  3 │ C2   │ 30.0 │
└────┴──────┴──────┘
首先,我使用groupby按列编号对数据帧进行分组

我现在想做三件事:

从第2列中获取值列表,在第2列中,此组所有行中的col2==0.0 获取“不”的列表col2!=0.0表示col1=='A',但组中至少有一行的col2==0.0,在本例中为第3行 获取No的列表,其中至少1行包含col2==0.0 No.2和3 很抱歉一次问了三个问题。希望没问题

谢谢:

您可以使用:

g = df['col2'].eq(0).groupby(df['No'])
a = g.all()
a = a.index[a].tolist()
print (a)
[2]

b1 = (df['col2'].ne(0) & df['col1'].eq('A')).groupby(df['No']).any()
b2 = (df['col2'].eq(0) & df['col1'].ne('A')).groupby(df['No']).any()
b = b1 & b2
b = b.index[b].tolist()
print (b)
[]

c = g.any()
c = c.index[c].tolist()
print (c)
[2,3]
另一个解决方案应该是用于返回布尔数据帧和最终创建包含3个列表的字典的自定义函数:

def f(x):
    a = x['col2'].eq(0)
    b1 = x['col2'].ne(0) & x['col1'].eq('A')
    b2 = a & x['col1'].ne('A')
    b = b1.any() & b2.any()

    return pd.Series([a.all(), b, a.any()], index=list('abc'))

m = df.groupby('No').apply(f)
print (m)
        a      b      c
No                     
1   False  False  False
2    True  False   True
3   False  False   True

fin = {x: m[x].index[m[x]].tolist() for x in m.columns}
print (fin)
{'a': [2], 'b': [], 'c': [2, 3]}

预期输出为3个列表?还是数据帧?你能把它加到答案上吗?性能很重要?请发布每个项目的预期输出Col2!=0.0对于第二个列表是正确的?是的,列表很好,不需要整个数据帧,因为我只需要第二个解决方案中的组号1、2、3,b不起作用。至少当它应该像第一次一样找到数百个时,它没有找到任何solution@MaMo-不客气!也可以自由投票给我的解决方案,谢谢。对不起,有一个问题:为什么我不需要在第二个解决方案中b2的a.any?@MaMo-你在b1中需要它两次。any&b2.any-需要链2面具到b。如果再加一个b.any,从数组中获取标量值,什么都不需要。