2017-05-22 3 views
0

私はこのようなデータフレームを持っている:マージパンダのピボットテーブル

Application|Category|Feature|Scenario|Result|Exec_Time 
A1|C1|F1|scenario1|PASS|2.3 
A1|C1|F1|scenario2|FAIL|20.3 
A2|C1|F3|scenario3|PASS|12.3 
...... 

私が探しています結果は機能してもexecの時間の合計によって結果のカウント数とピボットとなります。この

Application|Category|Feature|Count of PASS|Count of FAIL|SumExec_Time  
A1|C1|F1|200|12|45.62 
A1|C1|F2|90|0|15.11 
A1|C2|F3|97|2|33.11* 

のように私は機能によって、結果数と実行時間の合計のピボットを取得するために、個々のデータフレームを得たが、私は私の最後の期待される結果を得るために、それらのデータフレームをマージすることはできませんよ。

dfr = pd.pivot_table(df,index=["Application","Category","Feature"], 
values=["Final_Result"],aggfunc=[len]) 

dft = pd.pivot_table(df,index=["Application","Category","Feature"], 
values=["Exec_time_mins"],aggfunc=[np.sum]) 

答えて

0
#Count total records, number of FAILs and total time. 
df2 = df.groupby(by=['Application','Category','Feature']).agg({'Result':[len,lambda x: len(x[x=='FAIL'])],'Exec_Time':sum}) 

#rename columns 
df2.columns=['Count of PASS','Count of FAIL','SumExec_Time'] 

#calculate number of pass 
df2['Count of PASS']-=df2['Count of FAIL'] 

#reset index 
df2.reset_index(inplace=True) 

df2 
Out[1197]: 
    Application Category Feature Count of PASS Count of FAIL SumExec_Time 
0   A1  C1  F1    1    1   22.6 
1   A2  C1  F3    1    0   12.3 
+0

うわー、groupbyの使用について考えたことはありません!これは完璧に働いた、ありがとう! – xzp2050

+0

あなたは大歓迎です。 – Allen

1

ここで結果をマージする必要はありません。これを1つのpivot_tableまたはgroupby/applyで作成できます。私はあなたのデータを持っていないが、これはあなたが望むものを得ることができますか?あなたの応答のための

pivot = pd.pivot_table(df, index=["Application","Category","Feature"], 
          values = ["Final_Result", "Exec_time_mins"], 
          aggfunc = [len, np.sum]) 
+0

感謝。それは部分的に問題を解決します。 len.Exec_time、len.Final_Result、およびsum.Exec_timeという3つの列があります。私が必要とするのは、最終結果をPASSとFAILのカウントに分割することです。このソリューションでは、私はテストのカウントを取得します。 scrshotをここに追加したいと思ったが、私は傾けるように見える。 – xzp2050