首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从单个df派生多个df,使每个df没有NaN值。

从单个df派生多个df,使每个df没有NaN值。
EN

Stack Overflow用户
提问于 2020-04-07 05:25:18
回答 2查看 61关注 0票数 2

我想把这张桌子换成

代码语言:javascript
复制
0   thg   John     3.0
1   thg  James     4.0
2   mol    NaN     5.0
3   mol    NaN     NaN
4   lob    NaN     NaN

在下面的表格中

代码语言:javascript
复制
df1
movie   name  rating
0   thg   John     3.0
1   thg  James     4.0

df2
    movie  rating
2   mol     5.0

df3
    movie
3   mol  
4   lob  

如果每个数据都没有Nan值,也可以告诉方法是否需要相对于空白值而不是Nan进行分离。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-07 06:28:21

我认为,新目标DataFrame的启动不仅应该发生在 number of NaN值发生变化时(与上一行相比),而且还应该发生在该数字相同时,但NaN值位于不同列中。

因此,我提出以下方案:

代码语言:javascript
复制
dfs = [g.dropna(how='all',axis=1) for _,g in
    df.groupby(df.isna().ne(df.isna().shift()).any(axis=1).cumsum())]

您可以打印部分DataFrames (任意数量),运行:

代码语言:javascript
复制
n = 0
for grp in dfs:
    print(f'\ndf No {n}:\n{grp}')
    n += 1

当您向源DataFrame添加包含以下内容的另一行时,我的解决方案相对于其他解决方案的优势变得显而易见:

代码语言:javascript
复制
5   NaN    NaN    3.0

它还包含1非空值(就像前面的两行)。另一种解决方案将将所有这些行视为包含以下内容的一个部分DataFrame:

代码语言:javascript
复制
  movie  rating
3   mol     NaN
4   lob     NaN
5   NaN     3.0

正如您所看到的,具有 NaN值,而我的解决方案将这些行划分为2个单独的DataFrames,没有任何NaN。

票数 3
EN

Stack Overflow用户

发布于 2020-04-07 05:32:43

创建一个dfs列表,其中包含一个groupby和dropna:

代码语言:javascript
复制
dfs = [g.dropna(how='all',axis=1) for _,g in df.groupby(df.isna().sum(1))]
print(dfs[0],'\n\n',dfs[1],'\n\n',dfs[2])

或迪克特:

代码语言:javascript
复制
d = {f"df{e+1}": g[1].dropna(how='all',axis=1) 
       for e,g in enumerate(df.groupby(df.isna().sum(1)))}
print(d['df1'],'\n\n',d['df2'],'\n\n',d['df3']) #read the keys of d

代码语言:javascript
复制
  movie   name  rating
0   thg   John     3.0
1   thg  James     4.0 

   movie  rating
2   mol     5.0 

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

https://stackoverflow.com/questions/61073320

复制
相关文章

相似问题

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