2016-03-31 79 views
0

İlk sorun şudur: İlk satır matrisi 10 satır ve 12 satır olsun. Tüm satırlar için iki satırı birlikte toplamak istiyorum. Sonunda 10 satır olmalı ama sadece 6 satır olmalı. Şu anda,Nümerik dizi veya pandalarla pythonda rutini sadeleştirme

for i in range(0,12,2): 
    coarse[i]=initial.iloc[:,i:i+1].sum(axis=1) 

Aslında (bir pandalar DataFrame olan başlangıçtaki kullanarak) python döngü için aşağıdaki yapıyorum, ben daha verimli bir şey mümkün olduğunu oldukça eminim. Liste anlama, DataFrame veya numpy dizisi gibi bir şey düşünüyorum. Herhangi birinin bir fikri var mı ?

Ayrıca büyük numpy dizileri veya pandalar DataFrame işlemek için daha iyi olup olmadığını bilmek isterim.

+0

örnek bir temsilci girişi eklemek Could Bu aksi ne olduğudur? – Divakar

+0

Bir veri çerçevesinde satır ve sütun var. Yukarıdaki satırlara yaptığınız referansın, açıkça belirtilmiş satırlar olduğu için aslında sütunlar olduğunu varsayalım. Ancak, yukarıdaki örnek kodunuz sütun çiftleri ekliyor. – Alexander

cevap

1

çözümünü göstermek için küçük bir örnek dataframe yaratalım:

np.random.seed(0) 
df = pd.DataFrame(np.random.rand(6, 3)) 

>>> df 
      0   1   2 
0 0.548814 0.715189 0.602763 
1 0.544883 0.423655 0.645894 
2 0.437587 0.891773 0.963663 
3 0.383442 0.791725 0.528895 
4 0.568045 0.925597 0.071036 
5 0.087129 0.020218 0.832620 

ilk satırda (::2) başlayarak ve ikinci sıranın (1::2) başlayarak her iki satırdan seçmek için dilim biçimi kullanabilirsiniz. iloc tamsayı endeksleme içindir. Bu konumlardaki değerleri seçmeniz ve bunları birlikte eklemeniz gerekir. Sonuç, gerektiğinde tekrar DataFrame'e dönüştürebileceğiniz bir sayı dizisidir.

>>> df.iloc[::2].values + df.iloc[1::2].values 
array([[ 1.09369669, 1.13884417, 1.24865749], 
     [ 0.82102873, 1.68349804, 1.49255768], 
     [ 0.65517386, 0.94581504, 0.9036559 ]]) 

İndekslemeyi kaldırmak için değerleri kullanırsınız.

>>> df.iloc[::2] + df.iloc[1::2].values 
      0   1   2 
0 1.093697 1.138844 1.248657 
2 0.821029 1.683498 1.492558 
4 0.655174 0.945815 0.903656 

>>> df.iloc[::2].values + df.iloc[1::2] 
      0   1   2 
1 1.093697 1.138844 1.248657 
3 0.821029 1.683498 1.492558 
5 0.655174 0.945815 0.903656 

daha genel çözüm için:

df = pd.DataFrame(np.random.rand(9, 3)) 
n = 3 # Number of consecutive rows to group. 
df['group'] = [idx // n for idx in range(len(df.index))] 

df.groupby('group').sum() 
       0   1   2 
group        
0  1.531284 2.030617 2.212320 
1  1.038615 1.737540 1.432551 
2  1.695590 1.971413 1.902501 
+0

Cevabınız için çok teşekkür ederim, sorun şu ki, bu işlemi farklı bir "yeniden gruplama toplamı" büyüklüğü için tekrarlamam gerekiyor. Örneğin, matrisimde 15 satır ve 3 sütun olabilir. Sonra önce 3 (row0 + row1 + row2, row3 + row4 + row5 ... 3 son sıraya kadar) ile gruplandırılmış satırların toplamını hesaplamak zorundayım; ikincisi, işlemi tekrarlamak istiyorum ama satırları 5'e göre gruplamak (row0 + ... + row4; ...; row10 + ... + row14). Umarım yeterince açıkımdır! Teklif ettiğimden daha hızlı bir yöntem biliyor musunuz ve gruplama büyüklüğüne kolayca uyum sağlayabiliyor muyum? – orpheu

+0

Yukarıdaki düzenlemeye bakın. – Alexander

+0

Çok teşekkürler Alexander. Sadece son bir soru: Bana "idx // n" nin ne anlama geldiğini veya bana bunu açıklayan bir web sitesi olduğunu açıklayabilir misiniz? – orpheu

İlgili konular