将行迭代与成对乘法相结合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将行迭代与成对乘法相结合相关的知识,希望对你有一定的参考价值。

我有以下数据帧:

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

谢谢你的帮助。

答案

我认为你的问题是你的前几行中的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。之后,您将使用列表中的最后一项作为之前的值。

以上是关于将行迭代与成对乘法相结合的主要内容,如果未能解决你的问题,请参考以下文章

《ServerSuperIO Designer IDE使用教程》- 7.增加机器学习算法,通讯采集数据与算法相结合。发布:4.2.5 版本

jdk8源码Arrays.sort插入排序,居然还可以成对插入

jdk8源码Arrays.sort插入排序,居然还可以成对插入

无人机如何与编程算法相结合?

使用 for 循环将行迭代到使用 Pandas 和 Numpy Python 的 csv 文件

Matlab - 迭代地将行插入/追加到矩阵中