我是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]))
有没有办法做到这一点并将结果直接放在数据框的新列中?
非常感谢, 问候, 于连
答案 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
的产率:
<强> 数据:的强>
考虑使用单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
答案 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()