2017-09-18 128 views
1

我使用的大熊貓,並創造了2個透視表,然後使用下面的代碼交錯他們進入1個數據幀:添加計算列

df_sales = pd.read_sql_query(sales_query, cnxn, params=[report_start, end_mtd, whse])         
print('executing sales sql for warehouse : ' + whse)                 
df_sales['PERIOD'] = (((df_sales['INV_MONTH'].astype(str) + '/' + df_sales['INV_YEAR'].astype(str))))     
df_sales = pd.pivot_table(df_sales, index=['REP', 'CUST_NO'], columns=['PERIOD'], values=['SALES'], fill_value=0)  

df_profit = pd.read_sql_query(profit_query, cnxn, params=[report_start, end_mtd, whse])        
print('executing profit sql for warehouse : ' + whse)                 
df_profit['PERIOD'] = (((df_profit['INV_MONTH'].astype(str) + '/' + df_profit['INV_YEAR'].astype(str))))    
df_profit = pd.pivot_table(df_profit, index=['REP', 'CUST_NO'], columns=['PERIOD'], values=['PROFIT'], fill_value=0) 

df = pd.concat([df_sales, df_profit], axis=1)[list(interleave([df_sales, df_profit]))]  

我的輸出是這樣的:

SALES  PROFIT  SALES PROFIT  
01/2017 01/2017 02/2017 02/2017 
$96.01  $23.18 $7,347.66 $1,267.72  
$600.00 $146.35 $600.00 $147.15 

我想計算的df['MARGIN']列添加到該表給出的輸出:

SALES  PROFIT  MARGIN SALES  PROFIT  MARGIN 
01/2017 01/2017 02/2017 02/2017  02/2017  02/2017 
$96.01  $23.18 24.14% $7,347.66 $1,267.72 17.25% 
$600.00 $146.35 24.39%  $600.00 $147.15  24.53% 

我嘗試使用df['MARGIN'] = df['PROFIT']/df['SALES'],但得到了一個錯誤:

ValueError: Wrong number of items passed 12, placement implies 1

假設這是錯誤的,因爲我已經包含在我的報告12期。

+0

什麼爲df的'結果[ 'PROFIT']'/'DF [ 'SALES']'。似乎是一個數據類型的問題 –

+0

@ A.Kot他們都是float64 – AlliDeacon

+0

我認爲這個問題是重複的列名。 – Dark

回答

1

你可以做你想做,只要你的列索引是什麼。排序。

假設:

df = pd.concat([df_sales, df_profit], axis=1) 

爲您提供了與列兩級分級指數數據框,你可以這樣做:

df = pd.concat([df_sales, df_profit], axis=1) 
df["MARGIN"] = df["PROFIT"]/df["SALES"] 

如果此操作失敗,是因爲列索引不排序。你可以通過這樣做來修復它:

df = pd.concat([df_sales, df_profit], axis=1) 
df.sort_index(axis=1, inplace=True) 
df["MARGIN"] = df["PROFIT"]/df["SALES"] 

然後你就像以前一樣交錯列。

更新:

甲難看溶液至最終交織:

n = len(df.columns) // 3 
# Using sum for lists is highly discouraged! But convenient in this case :) 
cols = sum(([j * n + i for j in range(3)] for i in range(n)), []) 
df = df.iloc[:, cols] 
0

你期待熊貓以某種方式知道,當你說利潤率等於利潤除以銷售,你的意思是,保證金特定日期等於利潤在這個時間通過銷售該日期劃分?熊貓不是心靈讀者。您使用多重索引假設,你可以這樣做:

for reporting_date in df.columns.get_level_values(1): 
    df['MARGIN',reporting_date'] = df['PROFIT',reporting_date']/df['SALES',reporting_date'] 

然而,這仍然可能會返回一個錯誤;鑑於你有美元符號和逗號,可能這些金額會以字符串形式存儲。你應該將它們存儲爲整數或浮點數,如果你真的想看到他們顯示爲美元,寫一個display_as_dollars功能。

編輯:您也可以嘗試DF [ '保證金'] = DF [ '利潤'] DIV(DF [ 'SALES'])