2016-09-15 26 views
-2

我在下面有df1。我將其複製到df2以節省df1;那麼我使用df3來計算超過df2在Dataframe Pandas的行上應用權重公式

df2=df1.copy() 

我要計算這樣的重量Weight(A) = Price(A)/Sum(row_Prices)並將其返回到df2下面的價格,如對於每一行,我得到3行數據,價格,性病和重排。我也想計算行上的std,我想它是一個類似的形式。

我已經試過這

df3 = df2.iloc[1:,1:].div(df2.iloc[1:,1:].sum(axis=1), axis=0) 

拿到重物,然後打印df3,但它不工作。

對於每個日期獲取2行我試圖堆垛.stack()但我可能做錯了。幫幫我!謝謝

     A  B  C  D  E 
2006-04-27 00:00:00          
2006-04-28 00:00:00 69.62 69.62 6.518 65.09 69.62 
2006-05-01 00:00:00 71.5 71.5 6.522 65.16 71.5 
2006-05-02 00:00:00 72.34 72.34 6.669 66.55 72.34 
2006-05-03 00:00:00 70.22 70.22 6.662 66.46 70.22 
2006-05-04 00:00:00 68.32 68.32 6.758 67.48 68.32 
2006-05-05 00:00:00  68  68 6.805 67.99  68 
2006-05-08 00:00:00 67.88 67.88 6.768 67.56 67.88 

我想它很好的輸出繼電器這樣:

      A  B  C  D  E 
2006-04-27 00:00:00 

2006-04-28 00:00:00          
      price  69.62 69.62 6.518 65.09 69.62 
      weight 
      std 
2006-05-01 00:00:00 
      price   71.5 71.5 6.522 65.16 71.5 
      weight 
      std 
2006-05-02 00:00:00 
      price  72.34 72.34 6.669 66.55 72.34 
      weight 
      std 
+0

是的這只是一個錯字這裏..我得到了df1的副本。雖然 – uniXVanXcel

+1

你是怎麼得到'df1'的?您的索引名稱:'2006-04-27 23:55:00'看起來很奇怪...你可以發佈'print(df2)'和'print(df2.index)' – MaxU

+0

的輸出,我只是簡單地將索引修改爲在頂部添加一行另一組值,但在我看來這不是那麼相關。爲了避免混淆,我改變了桌子。謝謝 – uniXVanXcel

回答

1

據我所知,沒有一個班輪 - 快速和骯髒的方式來實現你想什麼去做。 你需要計算所有數據,然後將其全部合併到一個使用多級索引DataFrame

# Making weight/std DataFrames 
cols = list('ABCDE') 
weight = pd.DataFrame([df[col]/df.sum(axis=1) for col in df], index=cols).T 
std = pd.DataFrame([df.std(axis=1) for col in df], index=cols).T 

# Making MultiIndex DataFrame 
mindex = pd.MultiIndex.from_product([['price', 'weight', 'std'], df.index]) 
new_df = pd.DataFrame(index=mindex, columns=cols) 

# Inserting data 
new_df.ix['price'] = df.values 
new_df.ix['weight'] = weight.values 
new_df.ix['std'] = std.values 

# Swapping levels 
new_df = new_df.swaplevel(0, 1).sort_index() 

產生的new_df應該看起來有點像這樣:

2006-04-28 price  69.62  69.62  6.518  65.09  69.62 
      std  27.7829 27.7829 27.7829 27.7829 27.7829 
      weight 0.248228 0.248228 0.0232397 0.232076 0.248228 
2006-05-01 price  71.5  71.5  6.522  65.16  71.5 
      std  28.4828 28.4828 28.4828 28.4828 28.4828 
      weight 0.249841 0.249841 0.0227897 0.227687 0.249841 
2006-05-02 price  72.34  72.34  6.669  66.55  72.34 
      std  28.8308 28.8308 28.8308 28.8308 28.8308 
      weight 0.249243 0.249243 0.0229776 0.229294 0.249243 
2006-05-03 price  70.22  70.22  6.662  66.46  70.22 
      std  28.0509 28.0509 28.0509 28.0509 28.0509 
      weight 0.247443 0.247443 0.0234758 0.234194 0.247443 
2006-05-04 price  68.32  68.32  6.758  67.48  68.32 
      std  27.4399 27.4399 27.4399 27.4399 27.4399 
      weight 0.244701 0.244701 0.024205 0.241692 0.244701 
2006-05-05 price   68  68  6.805  67.99  68 
      std  27.3661 27.3661 27.3661 27.3661 27.3661 
      weight 0.243907 0.243907 0.0244086 0.243871 0.243907 
2006-05-08 price  67.88  67.88  6.768  67.56  67.88 
      std  27.2947 27.2947 27.2947 27.2947 27.2947 
      weight 0.244201 0.244201 0.0243481 0.24305 0.244201 

作爲一個邊請注意,我不確定你想要計算哪種類型的標準,所以我只是假定它是按行計算的價格標準(這將是每行的單個/重複值)。

+0

優秀的謝謝! – uniXVanXcel

+0

其中一個問題實際上是我在第一行中有一個類型字符串indexed 2006-04-27 00:00:00,所以weight和std函數不能正常工作,因爲它們試圖比較字符串和浮點數。你知道如何過濾只有int或浮點數的行嗎? – uniXVanXcel

+0

爲重量公式我得到這個:TypeError:無法比較類型'時間戳''字符' – uniXVanXcel