首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除大熊猫中的列时保留空列表

删除大熊猫中的列时保留空列表
EN

Stack Overflow用户
提问于 2019-06-03 00:58:47
回答 2查看 118关注 0票数 3

背景

我有以下数据

代码语言:javascript
复制
import pandas as pd
df = pd.DataFrame({'Result' : [['pos', '+', 'pos', 'positive'], ['neg', 'neg'], [], ['pos']], 
                  'P_ID': [1,2,3,4], 
                  'Gene' : [['kras', 'kras', 'kras', 'egfr'], ['brca', 'brca'], [], ['cd133']],
                  'N_ID' : ['A1', 'A2', 'A3', 'A4']

                 })

#rearrange columns
df = df[['P_ID', 'N_ID', 'Gene', 'Result']]
df


  P_ID N_ID         Gene                         Result
0   1   A1  [kras, kras, kras, egfr]    [pos, +, pos, positive]
1   2   A2  [brca, brca]                [neg, neg]
2   3   A3  []                          []
3   4   A4  [cd133]                     [pos]

我使用了取自unnest (explode) multiple list 2.0的以下代码

代码语言:javascript
复制
df.set_index('P_ID').apply(lambda x: x.apply(pd.Series).stack()).ffill().reset_index().drop('level_1', 1)

问题

使用上面的代码,我就接近了我想要的。但是,由于第三行GeneResult2是空列表[],所以在它上面的行的输出如下所示:

代码语言:javascript
复制
 P_ID   N_ID Gene   Result
0   1   A1  kras    pos
1   1   A1  kras    +
2   1   A1  kras    pos
3   1   A1  egfr    positive
4   2   A2  brca    neg
5   2   A2  brca    neg
6   3   A3  brca    neg
7   4   A4  cd133   pos

相反,我希望得到下面的输出,下面的行6 3 A3 [] []反映原始的dataframe df,其中包含空列表。

期望输出

代码语言:javascript
复制
   P_ID N_ID Gene   Result
0   1   A1  kras    pos
1   1   A1  kras    +
2   1   A1  kras    pos
3   1   A1  egfr    positive
4   2   A2  brca    neg
5   2   A2  brca    neg
6   3   A3  []      []
7   4   A4  cd133   pos

问题

如何获得所需的输出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-03 01:04:55

让我们试试堆叠和打开堆叠的魔法。这也保留了空列表。

代码语言:javascript
复制
(df.set_index(['P_ID', 'N_ID'])
   .stack()
   .str.join(',')
   .str.split(',', expand=True)
   .stack()
   .unstack(-2)
   .reset_index(level=[0, 1])
   .reset_index(drop=True))

   P_ID N_ID    Result   Gene
0  1     A1   pos       kras 
1  1     A1   +         kras 
2  1     A1   pos       kras 
3  1     A1   positive  egfr 
4  2     A2   neg       brca 
5  2     A2   neg       brca 
6  3     A3                  
7  4     A4   pos       cd133

详细信息

首先,设置不能作为索引被触及的列。

代码语言:javascript
复制
df.set_index(['P_ID', 'N_ID'])

                            Result                      Gene
P_ID N_ID                                                   
1    A1    [pos, +, pos, positive]  [kras, kras, kras, egfr]
2    A2    [neg, neg]               [brca, brca]            
3    A3    []                       []                      
4    A4    [pos]                    [cd133]                 

接下来,stack行。

代码语言:javascript
复制
_.stack()

P_ID  N_ID        
1     A1    Result    [pos, +, pos, positive] 
            Gene      [kras, kras, kras, egfr]
2     A2    Result    [neg, neg]              
            Gene      [brca, brca]            
3     A3    Result    []                      
            Gene      []                      
4     A4    Result    [pos]                   
            Gene      [cd133]                 
dtype: object

我们现在有了一个系列。我们需要把这些元素炸成不同的列。所以,首先加入列表,然后再拆分。假设lists元素本身不包含逗号(如果不包含逗号,请查找另一个要加入和拆分的分隔符),此操作是可行的。

代码语言:javascript
复制
_.str.join(',').str.split(',', expand=True)

                      0     1     2         3
P_ID N_ID                                    
1    A1   Result  pos    +     pos   positive
          Gene    kras   kras  kras  egfr    
2    A2   Result  neg    neg   None  None    
          Gene    brca   brca  None  None    
3    A3   Result         None  None  None    
          Gene           None  None  None    
4    A4   Result  pos    None  None  None    
          Gene    cd133  None  None  None    

我们需要去掉空值,所以再次调用stack

代码语言:javascript
复制
_.stack()

P_ID  N_ID           
1     A1    Result  0    pos     
                    1    +       
                    2    pos     
                    3    positive
            Gene    0    kras    
                    1    kras    
                    2    kras    
                    3    egfr    
2     A2    Result  0    neg     
                    1    neg     
            Gene    0    brca    
                    1    brca    
3     A3    Result  0            
            Gene    0            
4     A4    Result  0    pos     
            Gene    0    cd133   
dtype: object

我们快到了。现在,我们希望索引的第二个最后级别成为我们的列,因此使用unstack(-2) (在第二个最后级别上的unstack)展开堆栈。

代码语言:javascript
复制
_.unstack(-2)

               Result   Gene
P_ID N_ID                   
1    A1   0  pos       kras 
          1  +         kras 
          2  pos       kras 
          3  positive  egfr 
2    A2   0  neg       brca 
          1  neg       brca 
3    A3   0                 
4    A4   0  pos       cd133

最后,一些管家来获得我们原来的专栏。

代码语言:javascript
复制
_.reset_index(-1, drop=True).reset_index()

   P_ID N_ID    Result   Gene
0  1     A1   pos       kras 
1  1     A1   +         kras 
2  1     A1   pos       kras 
3  1     A1   positive  egfr 
4  2     A2   neg       brca 
5  2     A2   neg       brca 
6  3     A3                  
7  4     A4   pos       cd133

如果希望空格实际上是列表,请使用applymap

代码语言:javascript
复制
_.applymap(lambda x: x if x != '' else []))

   P_ID N_ID    Result   Gene
0  1     A1   pos       kras 
1  1     A1   +         kras 
2  1     A1   pos       kras 
3  1     A1   positive  egfr 
4  2     A2   neg       brca 
5  2     A2   neg       brca 
6  3     A3   []        []   
7  4     A4   pos       cd133
票数 2
EN

Stack Overflow用户

发布于 2019-06-03 01:43:10

经过调整后,unnesting仍然有效。

代码语言:javascript
复制
df=df.applymap(lambda x : [''] if x==[] else x)
unnesting(df,['Gene','Result'])
Out[20]: 
    Gene    Result N_ID  P_ID
0   kras       pos   A1     1
0   kras         +   A1     1
0   kras       pos   A1     1
0   egfr  positive   A1     1
1   brca       neg   A2     2
1   brca       neg   A2     2
2                    A3     3
3  cd133       pos   A4     4
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56420074

复制
相关文章

相似问题

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