2016-04-04 16 views
4

Verilerimden (kimyasallar ve proteinler arasındaki puanlar) python pandalarıyla bir veri çerçevesi oluşturmaya çalışıyorum.Python'daki (pandalar) bir sütundaki bir aralıktaki veri yığınları nasıl sıralanır

Veritabanımın önce en çok gerçekleşen proteinleri görüntülemesini istiyorum, bu nedenle daha önce verilerimi sıraladım. Ancak veri çerçevesini oluşturduğumda beklenen sonucu almaz.

İşte benim verilerin bir örneği verilmiştir:

chemicals prots scores 
CID000000006 10116.ENSRNOP00000003921 196 
CID000000051 10116.ENSRNOP00000003921 246 
CID000000085 10116.ENSRNOP00000003921 196 
CID000000119 10116.ENSRNOP00000003921 247 
CID000000134 10116.ENSRNOP00000008952 159 
CID000000135 10116.ENSRNOP00000008952 157 
CID000000174 10116.ENSRNOP00000008952 439 
CID000000175 10116.ENSRNOP00000001021 858 
CID000000177 10116.ENSRNOP00000004027 760 

siz "10116.ENSRNOP00000003921" Benim verilerindeki en gerçekleşen olaylara ile proteindir görebileceğiniz gibi.

Yani ben böyle bir şey almak istiyorum:

   10116.ENSRNOP00000003921  10116.ENSRNOP00000008952 
CID000000006 196     
CID000000051 246 
CID000000085 196 
CID000000119 247 
CID000000134         159 
CID000000135         157 
CID000000174         439 

Ve İşte benim kod:

import pandas as pd 

df_rat= pd.read_csv("dt_matrix_rat.csv",sep="\t", header=True) 
df_rat.columns = ['chemicals','proteins','scores'] 
df_rat1 = df_rat.pivot(index='chemicals', columns='proteins', values='scores') 

df_rat1.to_csv("rat_matrix.csv", sep='\t', index=True ) 
+0

Sen olay sayısını almak için 'collections.Counter.most_common()' kullanabilirsiniz, ancak zaten bu var gibi görünüyor ... pivot tablo gibi görünüyor bir tür dinlenme: https://en.wikipedia.org/wiki/Pivot_table – Swier

+0

Veriler zaten proteinler olaylar tarafından sıralanır, sadece aldığım matris sonuçta doğru sırada sonuç göstermez –

+0

@ELWalou, sütun veya satırların yanlış sırasını mı kastediyorsunuz? – MaxU

cevap

0

Bence sen sum'un notnullsort_values numarasına ve cols dizinine sahip olun. Lasy kullanım subset:

df1 = df.pivot(index='chemicals', columns='proteins', values='scores') 

cols = df1.notnull().sum(axis=0).sort_values(ascending=False).index 
print cols 
Index([u'10116.ENSRNOP00000003921', u'10116.ENSRNOP00000008952', 
     u'10116.ENSRNOP00000004027', u'10116.ENSRNOP00000001021'], 
     dtype='object', name=u'proteins') 

print df1[cols] 
proteins  10116.ENSRNOP00000003921 10116.ENSRNOP00000008952 \ 
chemicals               
CID000000006      196.0      NaN 
CID000000051      246.0      NaN 
CID000000085      196.0      NaN 
CID000000119      247.0      NaN 
CID000000134      NaN      159.0 
CID000000135      NaN      157.0 
CID000000174      NaN      439.0 
CID000000175      NaN      NaN 
CID000000177      NaN      NaN 

proteins  10116.ENSRNOP00000004027 10116.ENSRNOP00000001021 
chemicals               
CID000000006      NaN      NaN 
CID000000051      NaN      NaN 
CID000000085      NaN      NaN 
CID000000119      NaN      NaN 
CID000000134      NaN      NaN 
CID000000135      NaN      NaN 
CID000000174      NaN      NaN 
CID000000175      NaN      858.0 
CID000000177      760.0      NaN 

Veya reindex_axis:

print df1.reindex_axis(cols, axis=1) 
proteins  10116.ENSRNOP00000003921 10116.ENSRNOP00000008952 \ 
chemicals               
CID000000006      196.0      NaN 
CID000000051      246.0      NaN 
CID000000085      196.0      NaN 
CID000000119      247.0      NaN 
CID000000134      NaN      159.0 
CID000000135      NaN      157.0 
CID000000174      NaN      439.0 
CID000000175      NaN      NaN 
CID000000177      NaN      NaN 

proteins  10116.ENSRNOP00000004027 10116.ENSRNOP00000001021 
chemicals               
CID000000006      NaN      NaN 
CID000000051      NaN      NaN 
CID000000085      NaN      NaN 
CID000000119      NaN      NaN 
CID000000134      NaN      NaN 
CID000000135      NaN      NaN 
CID000000174      NaN      NaN 
CID000000175      NaN      858.0 
CID000000177      760.0      NaN 
+0

kodunuzun ikinci satırında" sort_values ​​() "ifadesinde eksik bir şey yok mu? Aldığım: 'NoneType' nesnesinin 'index' özniteliği yok –

+0

Sürüm pandaları 0.18.0 kullanıyorum. Sanırım sorun eski sürüm kullanıyorsa. – jezrael

0

yapabilirsiniz ya Kullanım @ Jezrael çözümü veya yapmak oldukça benzer bu şekilde ():

In [136]: df 
Out[136]: 
     chemicals      prots scores 
0 CID000000006 10116.ENSRNOP00000003921  196 
1 CID000000051 10116.ENSRNOP00000003921  246 
2 CID000000085 10116.ENSRNOP00000003921  196 
3 CID000000119 10116.ENSRNOP00000003921  247 
4 CID000000134 10116.ENSRNOP00000008952  159 
5 CID000000135 10116.ENSRNOP00000008952  157 
6 CID000000174 10116.ENSRNOP00000008952  439 
7 CID000000175 10116.ENSRNOP00000001021  858 
8 CID000000177 10116.ENSRNOP00000004027  760 

sağ düzeni hazırlayın

In [169]: df.groupby('prots').sum().sort('scores', ascending=False) 
Out[169]: 
          scores 
prots 
10116.ENSRNOP00000003921  885 
10116.ENSRNOP00000001021  858 
10116.ENSRNOP00000004027  760 
10116.ENSRNOP00000008952  755 

.sort() yerine .sort_values() kullanımı (pandalar eski sürümleri için) sıralı sütunların listesini hazırlayın:

In [170]: cols = df.groupby('prots').sum().sort_values(by='scores', ascending=False).index 

In [171]: cols 
Out[171]: 
Index(['10116.ENSRNOP00000003921', '10116.ENSRNOP00000001021', 
     '10116.ENSRNOP00000004027', '10116.ENSRNOP00000008952'], 
     dtype='object', name='prots') 

Pivot ve doğru sırada Sütunlarınızın ayarlayın:

In [175]: df_rat1 = df.pivot(index='chemicals', columns='prots', values='scores').fillna('') 

In [176]: df_rat1 = df_rat1[cols] 

In [177]: df_rat1 
Out[177]: 
prots  10116.ENSRNOP00000003921 10116.ENSRNOP00000001021 10116.ENSRNOP00000004027 10116.ENSRNOP00000008952 
chemicals 
CID000000006      196 
CID000000051      246 
CID000000085      196 
CID000000119      247 
CID000000134                         159 
CID000000135                         157 
CID000000174                         439 
CID000000175            858 
CID000000177                  760 
+0

iyi yapmak için çalışıyorum, koruma doğru sırayla değil –

+0

@ELWalou, cevabımı güncelledim - lütfen kontrol edin – MaxU

+0

hat 170 her zaman bana "AttributeError: 'DataFrame 'object' sort_values ​​'özniteliği yok "hata iletisi –

İlgili konular