使用DataFrame

时间:2017-02-01 18:03:04

标签: python pandas dataframe apply

我是pandas DataFrame的新手,我有点挣扎,因为我无法计算如何访问特定的单元格来计算以填充新的单元格。

我想使用apply来调用来自第-1行单元格数据的外部函数。

我做到了,但输出的内容只是一个简单的数组,但我确信有更好的方法可以做到:

我使用以下索引从csv构建我的dataFrame:

DateIndex = pd.date_range(start="2005-1-1", end="2017-1-1", freq=BDay())

根据以下摘录,我的数据框确定无误:

2005-01-03    0.005742
2005-01-04    0.003765
2005-01-05   -0.005536
2005-01-06    0.001500
2005-01-07    0.007471
2005-01-10    0.002108
2005-01-11   -0.003195
2005-01-12   -0.003076
2005-01-13    0.005416
2005-01-14    0.003090

所以,我想在第一个条目中添加100,对于其他条目,添加一个,然后将其乘以前一个条目。

我能够在一个数组中这样做:

for i in range(0,len(df.index)):
    if i == 0:
        listV = [df.iloc[i] + 100]
    else:
        listV.append(listV[i-1] * (1 + df.iloc[i]))

有没有办法做到这一点并将结果直接放在数据框的新列中?

非常感谢, 问候, 于连

2 个答案:

答案 0 :(得分:2)

这是实现同样目标的更好方法:

col_copy = df.col.copy()   # generate a copy to isolate the series completely
col_copy.iloc[0] += 100    # Increment first row by 100
col_copy.iloc[1:] += 1     # Increment 1 to rest

df.assign(new_col=col_copy.cumprod()) # compute cumulative product and assign to new column

的产率:

enter image description here

<强> 数据:

考虑使用单DF列的'Col'

txt = StringIO(
"""
2005-01-03    0.005742
2005-01-04    0.003765
2005-01-05   -0.005536
2005-01-06    0.001500
2005-01-07    0.007471
2005-01-10    0.002108
2005-01-11   -0.003195
2005-01-12   -0.003076
2005-01-13    0.005416
2005-01-14    0.003090
""")

df = pd.read_csv(txt, delim_whitespace=True, parse_dates=True, header=None, 
                 index_col=['date'], names=['date', 'col'])
df.index.name = None
df

enter image description here

答案 1 :(得分:2)

初始化

df = pd.DataFrame(dict(
        col=[ 0.005742,  0.003765, -0.005536,  0.0015  ,  0.007471,
              0.002108, -0.003195, -0.003076,  0.005416,  0.00309 ]
    ), pd.to_datetime([
            '2005-01-03', '2005-01-04', '2005-01-05', '2005-01-06', '2005-01-07', 
            '2005-01-10', '2005-01-11', '2005-01-12', '2005-01-13', '2005-01-14'])
    )

print(df)

                 col
2005-01-03  0.005742
2005-01-04  0.003765
2005-01-05 -0.005536
2005-01-06  0.001500
2005-01-07  0.007471
2005-01-10  0.002108
2005-01-11 -0.003195
2005-01-12 -0.003076
2005-01-13  0.005416
2005-01-14  0.003090

<强> 评论
这看起来是一系列的回报。通过在第一次观察中添加100,您可以将第一次返回边缘化为.57 基点,而不是.57

我相信你要做的就是添加一个添加到一切,然后取累积产品,然后乘以100。

这会显示 累积增长100 ,这是我相信你所追求的。

df.add(1).cumprod().mul(100)

                   col
2005-01-03  100.574200
2005-01-04  100.952862
2005-01-05  100.393987
2005-01-06  100.544578
2005-01-07  101.295746
2005-01-10  101.509278
2005-01-11  101.184956
2005-01-12  100.873711
2005-01-13  101.420043
2005-01-14  101.733431
df.add(1).cumprod().mul(100).plot()

enter image description here