2016-04-13 13 views
1

Ben şöyle bir DataFrame var:Bir veri çerçevesini satırların değerlerini kullanarak nasıl çözülür?

Ben DataFrame 'unravel', ve sınıf hakkında bilgi kaybetmek ama extra_teaching hakkında bilgi tutmak istiyorum, bu yüzden her biri için bir satır ile bitirmek
class passed  failed   extra_teaching 
A11  1   2    0.5 
A12  2   1    0.7 

geçen bireysel öğrenci.

Yani DataFrame bu benzeyen sonunda olmalıdır:

pass   extra_teaching 
1    0.5 
0    0.5 
0    0.5 
1    0.7 
1    0.7 
0    0.7 

ben nasıl hiçbir fikrim yok yeni DataFrame satır ekleme elle iterrows() kullanarak ve belki hariç pandas bunu yapmanın - Bir var herkes etmiştir neat yol?

GÜNCELLEME: Bu çalıştı

, çok şık olmasa da iş gibi görünüyor:

temp = [] 
df = df.set_index('class') 
for idx in df.index: 
    row = df.loc[idx] 
    t = {'class': idx, 'extra_teaching': row['extra_teaching']} 
    for i in range(0, int(row['passed'])): 
     t['pass'] = 1 
     temp.append(t) 
    for i in range(0, int(row['failed'])): 
     t['pass'] = 0 
     temp.append(t) 
df_exploded = pd.DataFrame(temp) 
+0

yapmak sınıfını senin indeksi, her elemanın üzerinde döngü, toplam geçişi hesaplamak ed + her satır için başarısız oldu ve ardından her satır için bir veri çerçevesi oluşturdu (ör. her sınıf) ve hepsini birleştirin. Geçiş vektörünü sakladığınız her bir sınıf için bir sütun tanıtmak isteyebilirsiniz, ör. [1 0 0] ve [1 1 0] bu durumda. Oradan basit olmalı – tschm

+0

Üç sütun, 'class',' geçti 've' başarısız 'mantıksal olarak' pass''a nasıl çevrilir? – Stefan

+0

@Stefan, 'sınıfı' görmezden geliyor, sadece verilerin ne olduğunu açıklamak için var. "geçti" her zaman "pass = 1" anlamına gelir, "başarısız" her zaman "pass = 0" anlamına gelir. – Richard

cevap

1

Dene:

def teaching_results(x): 
    num_rows = x.passed.iloc[0] + x.failed.iloc[0] 
    passed = x.passed.iloc[0] * [1] + x.failed.iloc[0] * [0] 
    extra_teaching = num_rows * [x.extra_teaching.iloc[0]] 
    class_code = x['class'].iloc[0] 
    return pd.DataFrame({'pass': passed, 'extra_teaching': extra_teaching, 'class': class_code}) 

df.groupby('class', as_index=False).apply(lambda x: teaching_results(x)) 

almak için:

class extra_teaching pass 
0 0 A11    0.5  1 
    1 A11    0.5  0 
    2 A11    0.5  0 
1 0 A12    0.7  1 
    1 A12    0.7  1 
    2 A12    0.7  0 
+0

Ah harika. Çok teşekkürler. "0", "1" vb. Değiştirmekten ziyade, "class" değişkenini bir sütun olarak tutmanın bir yolu var mı? – Richard

+0

Evet, güncellemeye bakın. – Stefan

+0

İnanılmaz! Teşekkür ederim. – Richard

İlgili konular