2017-02-02 1 views
0

日付範囲と場所の理由コードの数を含む列を持つピボットテーブルデータフレームがあります。パンダのデータフレームの各行の下に計算された行を追加します

理想的には、その特定の理由コードが表すその場所の総数の%の年齢の各場所の下に行を挿入したいと考えています。

したがって、列MS = 6でその行の合計が52の場合、その直下の行の列は11.5%になります。

さらに意味がある場合は、2番目の列として含めることもできます。
は、ここで私は現在、ここ

issue_query = """ 
select distinct int(obhssq), (obwhid), obrtrc, SUBSTRING(int(obivdt), 3, 2) as inv_month, ((SUBSTRING(int(obivdt), 3, 2) - 1)/3 + 1) as inv_quarter, 
int(obivdt) 
from hsdet where obrtrc != '' and obrtrc != 'TX' and obivdt > 170000 and obivdt < 990000 and obwhid in ('01', '03', '05', '06', '07', '08', '09', '11', '12') 

""" 
cursor.execute(issue_query) 
total_issues = 0 
hedrows = cursor.fetchall() 
for row in hedrows : 
    total_issues = total_issues + 1 
issue_df = pd.read_sql(issue_query, cnxn) 
issue_df.rename(columns={'00001' : 'Invoices', 'OBWHID' : 'Warehouse', 'OBRTRC':'Reason', 'INV_MONTH':'Month', 'INV_QUARTER':'Quarter', '00006':'Date'}, inplace=True) 
pivoted = pd.pivot_table(issue_df, index=["Warehouse", "Quarter"], values=["Invoices"], columns=['Reason'], aggfunc='count', fill_value=0) 
pivoted['Total']= pivoted.sum(axis=1) 
pivoted.loc['Total'] = pivoted.sum() 
print(pivoted) 

を使用しているコードは、私の現在の出力です:

Reason CE CS DG DR IC IO IP IW LC LD NC NO PB QC QW SC WH TTL 
(01, 1) 9 4 4 0 1 8 7 5 0 0 17 5 2 2 2 2 0 68 
(03, 1) 14 3 1 0 1 3 2 2 0 0 7 9 10 0 0 2 1 55 
(05, 1) 4 2 1 0 3 1 5 1 1 0 4 1 0 1 2 1 0 27 
(06, 1) 11 1 0 0 0 0 0 2 0 0 2 2 2 0 0 0 0 20 
(07, 1) 0 5 0 0 0 4 1 0 0 0 1 1 0 0 0 0 0 12 
(08, 1) 3 2 1 1 0 4 2 0 1 0 3 2 8 0 0 1 0 28 
(09, 1) 6 1 0 1 0 0 0 0 0 0 2 0 2 0 0 1 0 13 
(11, 1) 0 0 6 0 2 2 8 1 0 0 4 4 0 1 11 0 0 39 
(12, 1) 10 3 1 0 0 1 9 0 0 1 2 6 0 0 0 0 0 33 
Total 57 21 14 2 7 23 34 11 2 1 42 30 24 4 15 7 1 295 

私は以下のように行を挿入したいと思います:

Invoices                \ 
Reason CE CS DG DR IC IO IP IW LC LD NC NO PB QC QW SC WH TTL 
(01, 1) 9 4 4 0 1 8 7 5 0 0 17 5 2 2 2 2 0 68 
%age 13% 6% 6% 0% 1% 12% 10% 7% 0% 0% 25% 7% 3% 3% 3% 3% 0% 23% 

ありがとう!

+0

してください入力と期待される出力の例を追加してください。 – AndreyF

+0

@AndreyF done。ありがとうございました! – AlliDeacon

答えて

1

ない、これが最もエレガントなソリューションですが、それが動作を確認してください。

入力:

Reason CE CS 
0 (01,1) 1 3 
1 (02,1) 4 1 
2 (03,1) 3 7 
3 (04,1) 2 5 
4 (05,1) 0 4 
5 total 10 20 

ここでは、コードは次のとおりです。

def calc_percent(x, total_values): 
    x_array = x.values 
    x_values = x_array[1:] 
    new_x = [x_array[0]] + [str(100.0*x_values[i]/total_values[i]) +"%" for i in range(len(x_values))] 
    return np.asarray(new_x) 

total_row = df.iloc[-1,:] 
total_values = total_row.values[1:] 
rest_df = df.iloc[:-1, :] 
new_df = rest_df.apply(lambda x: calc_percent(x,total_values),axis=1) 
final_df = rest_df.append(new_df).sort_values("Reason") 
final_df.loc[final_df.shape[0]] = total_row 

出力:

Reason  CE  CS 
0 (01,1)  1  3 
0 (01,1) 10.0% 15.0% 
1 (02,1)  4  1 
1 (02,1) 40.0% 5.0% 
2 (03,1)  3  7 
2 (03,1) 30.0% 35.0% 
3 (04,1)  2  5 
3 (04,1) 20.0% 25.0% 
4 (05,1)  0  4 
4 (05,1) 0.0% 20.0% 
10 total  10  20 
+0

このソリューションをご利用いただきありがとうございます。私は今、 'KeyError: 'Reason''を取得しようとしています。申し訳ありません、これは私の最初のパンダプロジェクトです。私は何を試していいか分かりません。 – AlliDeacon

関連する問題