2017-01-01 83 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