2017-01-01 84 views
0

我有一定數量的小數據框,其中包含給定庫存的日期和股票價格。 Someone else向我展示瞭如何遍歷它們,使它們包含在名爲all_dfs的列表中。所以all_dfs[0]將與日期IBM美國股票,一個數據幀all_dfs[1]日期MMM美​​國股票等(如下圖所示的例子)。數據框中的日期列始終是相同的,但股票名稱都不相同,並且與股票列關聯的數字總是不同。所以,當你調用all_dfs[1]這是你會看到數據幀(即all_dfs[1].head()):將多個列添加到多個數據框

IDX  Date   MMM US equity  
0   1/3/2000  47.19  
1   1/4/2000  45.31  
2   1/5/2000  46.63  
3   1/6/2000  50.38 

我想同其他列添加到每個數據幀。所以我試圖通過它們循環並添加列。股票名稱列中的數字是進行其他列計算的基礎。

有更多的列加,但我認爲他們將通過同樣的方式SOC這一切環路列的示例中,我要添加:

Column 1 to add >>> df['P_CHG1D'] = df['Stock name #1'].pct_change(1) * 100 

Column 2 to add >>> df['PCHG_SIG'] = P_CHG1D > 3 

Column 3 to add>>> df['PCHG_SIG']= df['PCHG_SIG'].map({True:1,False:0}) 

這是代碼,我到目前爲止但它返回了all_dfs[i]的語法錯誤。

for i in range (len(df.columns)): 
for all_dfs[i]: 
    df['P_CHG1D'] = df.loc[:,0].pct_change(1) * 100 

所以我也有2個問題,我想不出

  1. 我不知道如何將列添加到在循環中每dataframes。因此,我將有=後做類似的東西all_dfs[i].['ADD COLUMN NAME'] = df['Stock Name 1'].pct_change(1) * 100

  2. 其中第二部分是df['Stock Name 1']這個不斷變化的(所以在這個例子中它被稱爲MMM美​​國股票但下一次它會被稱爲列第二個數據幀的頭 - 所以它可能是IBM美國股票),因爲每個數據幀都有一個不同的名字,所以我不知道如何正確地調用,在循環

我是新來的Python /所以如果我想着這個錯誤的方式,讓我知道是否有更好的解決方案。

回答

0

考慮遍歷alldfs的長度以引用循環中的每個元素。對於第一個新的列,使用.ix操作者通過2(第三列)的其列位置來選擇股票柱:

for i in range(len(alldfs)): 
    dfList[i].is_copy = False # TURNS OFF SettingWithCopyWarning 

    dfList[i]['P_CHG1D'] = dfList[i].ix[:, 2].pct_change(1) * 100 
    dfList[i]['PCHG_SIG'] = dfList[i]['P_CHG1D'] > 3 
    dfList[i]['PCHG_SIG_VAL'] = dfList[i]['PCHG_SIG'].map({True:1,False:0}) 
+0

這工作,但它確實如下 類型錯誤提供一個錯誤:不支持的操作數類型(一個或多個),用於/ :'str'和'float' 任何想法這意味着什麼>>但即使錯誤的數據框編譯與正確的信息。所以我不確定這是告訴我什麼 –

+0

是*股票*你的第三或第二列在每個DF?根據你發佈的數據,我假設股票是第三欄。但是這表明,* Date *被用作分隔符'/'顯示錯誤。也許一些dfs有*日期*作爲第三欄?添加'print(i)'來查找列表中哪個df是問題。 – Parfait