2017-07-20 8 views
4

私はすでにピボットされたデータフレームを持っています。ピボットテーブルはピボットデータフレームに作用します

   Cost  Transport  Currency   
Manufacturer ABC XYZ  ABC XYZ  ABC  XYZ 
Date             
2017-07-01 312 323  31 41 Pounds Pounds 
2017-07-02 423 335  21 32 Dollars Pounds 
2017-07-03 421 304  21 21 Dollars Pounds 

上記はメーカーからのコストや経費を建てている通貨でアイテムを購入することに関連するコストと輸送費を示しています。

は、私は何をしようとしていますが数字と場所を集約ありますそれらは通貨の下にあります。所望の出力は、私はパンダが与え全く好きではない

df.pivot_table(index='Date', columns='Currency', aggfunc=np.sum) 

を試してみました(それはどこから来ることは明らかであるように、私はまた、未評価を残している)

   Currency   
      Dollars  Pounds 
Date             
2017-07-01  0  312+323+31+41 
2017-07-02 423+21  335+32 
2017-07-03 421+21  304+21 

ですKeyError。

開始データフレームdfを取得するコードは次のとおりです。実際の使用例では、分析と集計のためにデータを最初にピボットする必要があります。したがって、my_listまたはdf_rawにピボット・テーブルを適用することはお勧めしません。

my_list = ["2017-07-01", "ABC",312, 31, "Pounds", "2017-07-01", "XYZ" ,323, 41, "Pounds", 
      "2017-07-02", "ABC", 423, 21, "Dollars", "2017-07-02", "XYZ" ,335, 32, "Pounds", 
      "2017-07-03", "ABC", 421, 21, "Dollars", "2017-07-03", "XYZ", 304, 21, "Pounds" ] 
df_raw = pd.DataFrame(np.array(my_list).reshape(6,5), 
        columns = ["Date", "Manufacturer", "Cost", "Transport", "Currency"]) 
df = df_raw.pivot(index='Date', columns='Manufacturer') 

答えて

1

使用stackgroupbysumunstack:セットアップと入力データフレームを使用して

my_list = ["2017-07-01", "ABC",312, 31, "Pounds", "2017-07-01", "XYZ" ,323, 41, "Pounds", 
      "2017-07-02", "ABC", 423, 21, "Dollars", "2017-07-02", "XYZ" ,335, 32, "Pounds", 
      "2017-07-03", "ABC", 421, 21, "Dollars", "2017-07-03", "XYZ", 304, 21, "Pounds" ] 
df_raw = pd.DataFrame(np.array(my_list).reshape(6,5), 
        columns = ["Date", "Manufacturer", "Cost", "Transport", "Currency"]) 
df = df_raw.pivot(index='Date', columns='Manufacturer') 

df = df.apply(pd.to_numeric,errors='ignore') 

データフレームの形を変えて計算する:

df.stack().groupby(['Date','Currency']).sum().sum(1).unstack(fill_value=0) 

出力:

Currency Dollars Pounds 
Date      
2017-07-01  0  707 
2017-07-02  444  367 
2017-07-03  442  325 
+0

感謝。 Stack、groupby、sum、unstackの印象的な使い方。 :-) – Spinor8

0

EDIT 2:改訂

df2 = df.stack() 
df2['total'] = df2['Cost'] + df2['Transport'] 
df2.reset_index(inplace = True) 
df2.pivot_table(index = 'Date', columns = 'Currency', values = 'total', aggfunc = np.sum, fill_value = 0) 

EDIT:以下の答えは実際にあなたが探しているものには受け入れられません。修正しようとします...

一つの方法...

df_raw['total_cost'] = df_raw['Cost'] + df_raw['Transport'] 
df_raw.pivot_table(index = 'Date', columns = 'Currency', values = ['total_cost'], aggfunc = 'sum', fill_value = 0) 
関連する問題