2017-05-24 104 views
3

下面是一個數據幀我有一個小樣本,我想計算的行添加到它的底部:熊貓添加計算行數據框的底部

sch  q1  q2  q3 
acc  Yes Yes No 
acc  Yes No  No 
acc  Yes No  No 
acc  Yes Yes Yes 

我想在添加行底部會給我每個列的「是」的值的百分比,以便它看起來像下面那樣。

sch  q1  q2  q3 
acc  Yes Yes No 
acc  Yes No  No 
acc  Yes No  No 
acc  Yes Yes Yes 
acc  1.00 0.5 0.25 

任何幫助將不勝感激。

回答

2

我看到你的Lambda和提高純大熊貓的解決方案:

df.append(df.eq('Yes').mean(), ignore_index=True) 

你不指定應該發生什麼列,所以我忽略了它。在我目前的解決方案中,此列將獲得值0

+0

謝謝,這絕對是目前爲止最好,最簡單的解決方案。對於sch,我想保持相同的價值,所以也應該是'acc'。我將如何包含這個?另外,如果我按sch分組,那麼我是否可以迭代組來將這一行添加到每個組的底部? – Cameron

+0

既然你想應用'sch'分組的追加,我會按照[這個答案]的想法(https://stackoverflow.com/questions/29082412/append-rows-to-a-pandas-groupby-object )。基本上,您將數據幀分組,將「是」計數寫入新的數據幀,然後取消分組原始數據幀以追加「是」計數數據幀。 – Sebastiaan

1
df.append(df.apply(lambda x: len(x[x=='Yes'])/len(x)),ignore_index=True) 

輸出:

q1 q2 q3 
0 Yes Yes No 
1 Yes No No 
2 Yes No No 
3 Yes Yes Yes 
4 1 0.5 0.25 
1

讓我們用pd.concatmeanto_frame和T爲轉置。

pd.concat([df,df.replace({'Yes':True,'No':False}).mean().to_frame().T.assign(sch='acc')]) 

輸出:

q1 q2 q3 sch 
0 Yes Yes No acc 
1 Yes No No acc 
2 Yes No No acc 
3 Yes Yes Yes acc 
0 1 0.5 0.25 acc 
1

承擔以下方法:

In [11]: df.loc[len(df)] = ['acc'] + df.filter(regex='^q\d+') \ 
             .eq('Yes').mean().values.tolist() 

In [12]: df 
Out[12]: 
    sch q1 q2 q3 
0 acc Yes Yes No 
1 acc Yes No No 
2 acc Yes No No 
3 acc Yes Yes Yes 
4 acc 1 0.5 0.25