首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从包含2列条件的df中删除数据

从包含2列条件的df中删除数据
EN

Stack Overflow用户
提问于 2021-08-19 04:55:00
回答 2查看 55关注 0票数 0

我想根据一列中的不同值和第二列中计数为零的非nan数据的计数来删除Dataframe中的行。

以下是原始的df:

代码语言:javascript
复制
   ColA ColB
0     a    1
1     a    2
2     a  NaN
3     a  NaN
4     b  NaN
5     b  NaN
6     b  NaN
7     b  NaN
8     c    4
9     c    5
10    c    6
11    c  NaN

我希望新的df删除索引4-7,因为ColA中的'b‘的不同值对ColB=0中的非NaN值有计数

代码语言:javascript
复制
  ColA ColB
0    a    1
1    a    2
2    a  NaN
3    a  NaN
4    c    4
5    c    5
6    c    6
7    c  NaN

我可以想出几种方法来做到这一点,创建一个不同值的数组,迭代df和数组来获得我需要的东西,但我希望得到更干净的东西。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2021-08-19 05:00:35

通过groupby()+transform()检查列'ColB‘是否为NaN,因为它提供了真/假的布尔级数,因此您可以按df’‘ColA’分组,并将第一次出现的真/假转换为整个组,然后在过滤后使用reset_index()删除索引

代码语言:javascript
复制
df[df['ColB'].notna().groupby(df['ColA']).transform('first')].reset_index(drop=True)
#you can also use .loc[]

输出:

代码语言:javascript
复制
    ColA    ColB
0   a       1.0
1   a       2.0
2   a       NaN
3   a       NaN
4   c       4.0
5   c       5.0
6   c       6.0
7   c       NaN
票数 1
EN

Stack Overflow用户

发布于 2021-08-19 05:05:26

我们还可以结合使用groupby transformany来选择包含"any“有效值的组,然后选择reset_index

代码语言:javascript
复制
df = df[
    df['ColB'].notna().groupby(df['ColA']).transform('any')
].reset_index(drop=True)

或者德摩根的等价物,不是所有的NaN

代码语言:javascript
复制
df = df[
    ~df['ColB'].isna().groupby(df['ColA']).transform('all')
].reset_index(drop=True)

df

代码语言:javascript
复制
  ColA  ColB
0    a   1.0
1    a   2.0
2    a   NaN
3    a   NaN
4    c   4.0
5    c   5.0
6    c   6.0
7    c   NaN
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68842229

复制
相关文章

相似问题

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