2016-04-13 12 views
1

私はこのようになりますDataFrameあります行の値を使ってデータフレームを '解く'方法は?

私はへ DataFrame「UNRAVEL」、およびクラスに関する情報を失うことなく、 extra_teachingの情報を維持したいので、私はそれぞれの行で終わる
class passed  failed   extra_teaching 
A11  1   2    0.5 
A12  2   1    0.7 

通過した個々の瞳孔。

のでDataFrameはこのように見て終わる必要があります。

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

私はiterrows()を使用して、手動で新しいDataFrameに行を追加することによって、おそらくを除いて、pandasでこれを行う方法を見当がつかない - 誰もが持っていますまともな方法?

UPDATE:

、私は非常にエレガントではないが動作しているようですが、これを試してみました:

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

クラスあなたの作りますインデックス、それの各要素をループし、合計パスを計算する行ごとにed + failedが発生し、各行(例:各クラス)、それらのすべてを連結します。パスベクタを格納するクラスごとに列を導入することができます(例:この場合、[1 0 0]と[1 1 0]。そこからシンプルにするべきです。 – tschm

+0

'class'、' passed'、 'failed'の3つのカラムはどうやって論理的に' pass'に変換されますか? – Stefan

+0

@Stefan私たちは 'class'を無視します。データが何であるかを説明するだけです。 'pass'は常に' pass = 1'に変換され、 'failed'は常に' pass = 0'に変換されます。 – Richard

答えて

1

は試してみてください。

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)) 

取得する:

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

ああ。本当にありがとう。 'class'変数を' 0'、 '1'などに変更するのではなく、上記の列として保持する方法はありますか? – Richard

+0

うん、更新を参照してください。 – Stefan

+0

すごい!ありがとうございました。 – Richard