如何删除每行上全零的列,然后按所选列的总和

时间:2016-03-10 07:41:56

标签: python pandas

我有以下数据框:

import pandas as pd
import io

temp=u"""probe,genes,sample1,sample2,sample3
1415777_at,Pnliprp1,20,0,11
1415805_at,Clps,17,0,55
1415884_at,Cela3b,47,0,100"""
df = pd.read_csv(io.StringIO(temp))
df

看起来像这样:

In [54]: df
Out[54]:
        probe     genes  sample1  sample2  sample3
0  1415777_at  Pnliprp1       20        0       11
1  1415805_at      Clps       17        0       55
2  1415884_at    Cela3b       47        0      100

我想做的是:

  1. 删除所有值为零的列

  2. 按其总和排序sample123,降序。

  3. 所需的输出是

            probe     genes   sample3  sample1
    0  1415777_at  Pnliprp1       11   20
    1  1415805_at      Clps       55   17
    2  1415884_at    Cela3b      100   47
    

    请注意,我要排序的是列。因此sample3应该是sample1的头部

    我坚持这个代码:

    # Deleting all zeros columns
    df[df.columns[(df.columns !=0).all()]]
    

    我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

根据列是否为样本列,可以轻松划分列

sample_cols = [c for c in df.columns if c.startswith('sample')]
nonsample_cols = [c for c in df.columns if c not in sample_cols]

要按总和对样本列进行排序,您可以执行

sorted(sample_cols, key=lambda c: df[c].sum())

(反向排序或其他任何方式都很容易。)

如果样本列为0,则删除样本列:

[c for c in sample_cols if df[c].sum() > 0]

您可以根据需要使用这些来更新sample_cols

这些基本上是您需要的构建块。根据自己的喜好操作列的列表后,即可

df[nonsample_cols + sample_cols]

答案 1 :(得分:1)

您可以使用sort_valuesreindex_axis

df = df.loc[:, (df !=0).all()]

s = df.iloc[:, 2:].sum().sort_values(ascending=False)
print s
sample3    166
sample1     84
dtype: int64

print s.index.tolist()
['sample3', 'sample1']

cols = df.columns[:2].tolist() 
       + df.iloc[:, 2:].sum().sort_values(ascending=False).index.tolist() 
print cols
['probe', 'genes', 'sample3', 'sample1']

print df.reindex_axis(labels=cols , axis=1)
        probe     genes  sample3  sample1
0  1415777_at  Pnliprp1       11       20
1  1415805_at      Clps       55       17
2  1415884_at    Cela3b      100       47

或者:

print df[cols]
        probe     genes  sample3  sample1
0  1415777_at  Pnliprp1       11       20
1  1415805_at      Clps       55       17
2  1415884_at    Cela3b      100       47