首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:通过消除NaN来清理数据框架

熊猫:通过消除NaN来清理数据框架
EN

Stack Overflow用户
提问于 2021-09-09 22:51:47
回答 1查看 155关注 0票数 1

我有一个数据框架,列中有几个NaN值。“STAN”中的数据只需要匹配相关的“语句”。并且可以消除重复的“语句”值。

因此,我有以下数据框架:

代码语言:javascript
复制
     Statement     STAN-A    STAN-B     STAN-C            STAN-D                      STAN-E                       STAN-F
0    Statement A   AB.AM-1   ABC ABC 1               NaN                         NaN                          NaN                         NaN
1    Statement A   AB.AM-1         NaN  ABCDE 5 ABCDE.01                         NaN                          NaN                         NaN
1    Statement A   AB.AM-1         NaN  ABCDE 5 ABCDE.02                         NaN                          NaN                         NaN
2    Statement A   AB.AM-1         NaN               NaN  ABC 62443-2-1:2009 4.2.3.4                          NaN                         NaN
3    Statement A   AB.AM-1         NaN               NaN   ABC 62443-3-3:2013 SR 7.8                          NaN                         NaN
4    Statement A   AB.AM-1         NaN               NaN                         NaN   ABC/ABC 27001:2013 A.8.1.1                         NaN
4    Statement A   AB.AM-1         NaN               NaN                         NaN                      A.8.1.2                         NaN
5    Statement A   AB.AM-1         NaN               NaN                         NaN                          NaN  ABCD AB 800-53 Rev. 4 CM-8
5    Statement A   AB.AM-1         NaN               NaN                         NaN                          NaN                        PM-5
6    Statement B   AB.AM-2   ABC ABC 2               NaN                         NaN                          NaN                         NaN
7    Statement B   AB.AM-2         NaN  ABCDE 5 ABCDE.01                         NaN                          NaN                         NaN
7    Statement B   AB.AM-2         NaN  ABCDE 5 ABCDE.02                         NaN                          NaN                         NaN
7    Statement B   AB.AM-2         NaN  ABCDE 5 ABCDE.05                         NaN                          NaN                         NaN
8    Statement B   AB.AM-2         NaN               NaN  ABC 62443-2-1:2009 4.2.3.4                          NaN                         NaN
9    Statement B   AB.AM-2         NaN               NaN   ABC 62443-3-3:2013 SR 7.8                          NaN                         NaN
10   Statement B   AB.AM-2         NaN               NaN                         NaN   ABC/ABC 27001:2013 A.8.1.1                         NAN
11   Statement B   AB.AM-2         NaN               NaN                         NaN                          NAN  ABCD AB 800-53 Rev. 5 CM-9

我想把它变成这样:

代码语言:javascript
复制
    Statement      STAN-A    STAN-B     STAN-C            STAN-D                      STAN-E                       STAN-F
0    Statement A   AB.AM-1   ABC ABC 1  ABCDE 5 ABCDE.01  ABC 62443-2-1:2009 4.2.3.4  ABC/ABC 27001:2013 A.8.1.1   ABCD AB 800-53 Rev. 4 CM-8
1    Statement A   AB.AM-1         NaN  ABCDE 5 ABCDE.02   ABC 62443-3-3:2013 SR 7.8                     A.8.1.2                         PM-5
2    Statement A   AB.AM-1         NaN               NaN  ABC 62443-2-1:2009 4.2.3.4                         NaN                         NaN
3    Statement B   AB.AM-2   ABC ABC 2  ABCDE 5 ABCDE.01  ABC 62443-2-1:2009 4.2.3.4  ABC/ABC 27001:2013 A.8.1.1   ABCD AB 800-53 Rev. 5 CM-9
4    Statement B   AB.AM-2         NaN  ABCDE 5 ABCDE.02   ABC 62443-3-3:2013 SR 7.8                         NaN                         NaN
5    Statement B   AB.AM-2         NaN  ABCDE 5 ABCDE.05                         NaN                         NaN                         NaN

到目前为止,我已经尝试过df.dropna(),但是,当然,这使我没有任何价值。我还尝试了以下几种方法:

代码语言:javascript
复制
df.assign(**{'STAN-B': df['STAN-B'].join(df['STAN-B'].dropna())})

但我明白:

代码语言:javascript
复制
AttributeError: 'Series' object has no attribute 'join'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-09 23:03:42

尝试:

代码语言:javascript
复制
x = df.groupby("Statement").apply(lambda x: x.apply(sorted, key=pd.isna))
x = x.dropna(subset=x.loc[:, "STAN-B":].columns, how="all")
print(x.reset_index(drop=True))

指纹:

代码语言:javascript
复制
     Statement   STAN-A     STAN-B            STAN-C                      STAN-D                      STAN-E                      STAN-F
0  Statement A  AB.AM-1  ABC ABC 1  ABCDE 5 ABCDE.01  ABC 62443-2-1:2009 4.2.3.4  ABC/ABC 27001:2013 A.8.1.1  ABCD AB 800-53 Rev. 4 CM-8
1  Statement A  AB.AM-1        NaN  ABCDE 5 ABCDE.02   ABC 62443-3-3:2013 SR 7.8                     A.8.1.2                        PM-5
2  Statement B  AB.AM-2  ABC ABC 2  ABCDE 5 ABCDE.01  ABC 62443-2-1:2009 4.2.3.4  ABC/ABC 27001:2013 A.8.1.1  ABCD AB 800-53 Rev. 5 CM-9
3  Statement B  AB.AM-2        NaN  ABCDE 5 ABCDE.02   ABC 62443-3-3:2013 SR 7.8                         NaN                         NaN
4  Statement B  AB.AM-2        NaN  ABCDE 5 ABCDE.05                         NaN                         NaN                         NaN

注意:如果要使用pd.concat创建此数据,请尝试添加axis=1作为参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69125505

复制
相关文章

相似问题

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