2016-03-10 46 views
2

我有以下的數據幀:如何刪除列上每行中的所有零,則其總和所選擇的列進行排序

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排序,按降序排列。

所需的輸出是

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

注意這裏,我要排序的列。

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

我怎樣才能做到這一點:所以樣品3應該在這個代碼是SAMPLE1

我堅持一個頭?

回答

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 
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] 
+0

這並不是我想要的。我想排序列,而不是行。所以sample3應該是樣本的頭1 – neversaint

+0

並且可能*不*使用硬編碼求和'df.sample1 + df.sample2 + df.sample3'。因爲實際上它不僅僅是3,而且總是在第二列之後。 – neversaint

+0

@neversaint查看更新。我認爲依賴列位置有點脆弱,因此請參閱建議的替代方案。 –

相關問題