将行迭代与成对乘法

时间:2017-12-26 19:26:56

标签: python pandas iteration multiplying

我有以下数据框:

                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])

感谢您的帮助。

1 个答案:

答案 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。之后,您将使用列表中的最后一项作为之前的值。