我有以下数据框:
in_scenario_USA USA index_in
month year
4 1960 NaN 0
5 1960 NaN 0
6 1960 0.000000 1.0
7 1960 0.000000 1.0
8 1960 0.000000 1.0
9 1960 0.000000 1.0
10 1960 0.000000 1.0
11 1960 0.000000 1.0
12 1960 0.000000 1.0
1 1961 0.000000 1.0
2 1961 0.025536 1.0
3 1961 0.003843 1.0
4 1961 0.019139 1.0
5 1961 0.000000 1.0
第一列是一个月的百分比回报率。根据我的场景,它是0或数字。我希望我的第二列将其第一个非空值保持为1,然后可以使用以下公式解释每个后续值:
USA index_in[i] = USA index_in[i-1] * (1 + in_scenario_USA)[i]
所以最后它看起来像这样:
in_scenario_USA USA index_in
month year
4 1960 NaN 0
5 1960 NaN 0
6 1960 0.000000 1.0
7 1960 0.000000 1.0
8 1960 0.000000 1.0
9 1960 0.500000 1.5
10 1960 0.500000 2.25
11 1960 0.000000 2.25
12 1960 0.000000 2.25
1 1961 0.000000 2.25
2 1961 -0.200000 1.8
3 1961 0.100000 1.98
4 1961 0.100000 2.178
5 1961 0.000000 2.178
我尝试了很多循环,但我觉得最接近准确的是这一循环,但我最终只得到NaN值。
for i in range(0, len(df_merged[col + ' index_in'])):
if df_merged[col + ' index_in'].iloc[i] == 1 and (df_merged[col + ' index_in'].iloc[-i] == 0):
continue
else:
df_merged[col + ' index_in'].iloc[i] = np.multiply(df_merged[col + ' index_in'].iloc[i-1], df_merged['in_scenario_' + col].iloc[i])
感谢您的帮助。
答案 0 :(得分:2)
我认为您的问题是前几行中的NaN
值,它们会成倍增加并导致添加NaN值。试试这个:
newcol = []
firstnonnan = True
for index, row in df.iterrows():
if row['in_scenario_USA'].isnull():
newcol.append(row['USA_index_in'])
elif firstnonnan = True:
newcol.append(1)
firstnonnan = False
else:
newcol.append(newcol[-1]*(1+row['in_scenario_USA']))
df['USA index_in'] = newcol
基本上,您将遍历数据框并构建一个列表以覆盖您的列。如果您的值为NaN
,那么您将采用该列中已有的相同值。当您第一次看到非NaN
时,您会在列表中添加1。之后,您将使用列表中的最后一项作为之前的值。