首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python:分组后分别对组使用apply

Python:分组后分别对组使用apply
EN

Stack Overflow用户
提问于 2018-04-15 13:15:45
回答 1查看 42关注 0票数 1

我的数据框架如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
┌────┬──────┬──────┐
│ 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对数据帧按列编号进行分组。

我现在想做三件事:

  1. 从No列获取该组所有行中的col2 == 0.0值列表(在本例中为第2号)
  2. 获取“No's where”( col2 != 0.0 for col1 == 'A' )的列表,但组中至少有一个行具有col2 == 0.0 (在本例中为第3行)
  3. 获得最少1行包含col2 == 0.0的No's列表(第2和第3行)

很抱歉一次问了三个问题。希望这样可以。

谢谢您:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-15 13:25:57

您可以使用:

代码语言:javascript
代码运行次数:0
运行
复制
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]

另一种解决方案应该是自定义函数,用于返回布尔型DataFrame和包含3个列表的最终创建字典:

代码语言:javascript
代码运行次数:0
运行
复制
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]}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49842343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档