我有以下数据框:
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
我想做的是:
删除所有值为零的列
按其总和排序sample123
,降序。
所需的输出是
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()]]
我怎样才能做到这一点?
答案 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_values
和reindex_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