遍历数据框中的列以运行/追加计算

时间:2018-06-22 21:19:40

标签: python pandas dataframe

我的数据框类型:

        Date       AAPL      NFLX       INTC  
0 2008-01-02  27.834286  3.764286  25.350000    
1 2008-01-03  27.847143  3.724286  24.670000    
2 2008-01-04  25.721428  3.515714  22.670000   
3 2008-01-07  25.377142  3.554286  22.879999    
4 2008-01-08  24.464285  3.328571  22.260000    

我想对每列中的每一只股票运行.pct_change(1),并将3列追加到df的末尾。

我已经知道该列的名称,例如AAPL,我知道该怎么做。有了这些先验知识,我就可以执行df ['AAPL_Ret'] = df.AAPL.pct_change(1)

但是最终,我的文件中将有100支股票,目标是自动进行计算,而不必在代码中单独键入每个股票行情记录。因此,我将不得不遍历所有列,然后以某种方式运行.pct_change。

有什么想法吗?非常感谢。

3 个答案:

答案 0 :(得分:3)

pct_change上调用DataFrame,然后使用concat可以很容易地将结果加回去。

df = df.set_index('Date')
pd.concat([df, df.pct_change(1).add_suffix('_Ret')], axis=1)

                 AAPL      NFLX       INTC  AAPL_Ret  NFLX_Ret  INTC_Ret
Date                                                                    
2008-01-02  27.834286  3.764286  25.350000       NaN       NaN       NaN
2008-01-03  27.847143  3.724286  24.670000  0.000462 -0.010626 -0.026824
2008-01-04  25.721428  3.515714  22.670000 -0.076335 -0.056003 -0.081070
2008-01-07  25.377142  3.554286  22.879999 -0.013385  0.010971  0.009263
2008-01-08  24.464285  3.328571  22.260000 -0.035972 -0.063505 -0.027098

需要注意的唯一一件事(您可能已经知道了这一点)是pct_change在具有非数字列的情况下将不起作用。

因此,另一个(更好)的选择是

pd.concat([df, df.select_dtypes(exclude=[object]).pct_change(1)], 1)

         Date       AAPL      NFLX       INTC      AAPL      NFLX      INTC
0  2008-01-02  27.834286  3.764286  25.350000       NaN       NaN       NaN
1  2008-01-03  27.847143  3.724286  24.670000  0.000462 -0.010626 -0.026824
2  2008-01-04  25.721428  3.515714  22.670000 -0.076335 -0.056003 -0.081070
3  2008-01-07  25.377142  3.554286  22.879999 -0.013385  0.010971  0.009263
4  2008-01-08  24.464285  3.328571  22.260000 -0.035972 -0.063505 -0.027098

当您拥有许多非数字列时,它们会优雅地处理它们。

OTOH,我建议您事先将Date设置为索引(并使用选项1),因为通常这是处理库存数据时要执行的操作。并非总是如此。

答案 1 :(得分:3)

请注意,period的{​​{1}}参数默认为pct_change,可以省略。

1 drop

'Date'

df.join(df.drop('Date', 1).pct_change().add_suffix('_Ret')) Date AAPL NFLX INTC AAPL_Ret NFLX_Ret INTC_Ret 0 2008-01-02 27.834286 3.764286 25.350000 NaN NaN NaN 1 2008-01-03 27.847143 3.724286 24.670000 0.000462 -0.010626 -0.026824 2 2008-01-04 25.721428 3.515714 22.670000 -0.076335 -0.056003 -0.081070 3 2008-01-07 25.377142 3.554286 22.879999 -0.013385 0.010971 0.009263 4 2008-01-08 24.464285 3.328571 22.260000 -0.035972 -0.063505 -0.027098

set_index

答案 2 :(得分:-1)

您可以做的一件事是

for col in df.columns:
    if not isstock(col):
        continue
    df["{}_Ret".format(col)] = df[col].pct_change(1)

我之所以包含isstock()部分,是因为您将日期作为列而不是索引,并且您不希望采用日期的百分比变化(我想)。您可以在其他地方定义isstock(),也可以在您的代码中将其替换为所需的任何条件。