为了账号安全,请及时绑定邮箱和手机立即绑定

如何在python中不同行的列之间相乘

如何在python中不同行的列之间相乘

凤凰求蛊 2021-11-09 20:36:12
这是等式。例子Numbers     | Date      | Mean1000        |12/1/2018  | 11002        |12/2/2018  | 01003        |12/3/2018  | 0.5 0          |12/4/2018  | 0.6 0          |12/5/2018  | 0.4 0          |12/6/2018  |0.1 0          |12/7/2018  | -0.7 0          |12/8/2018  | 0.2 0          |12/9/2018  | -0.1这里有我想要的|Numbers | Date      | Mean | Multiplication || ------ |-----------|------|----------------||1000    | 12/1/2018 | 1    | 1000           ||1002    | 12/2/2018 | 0    | 0*1000= 0      ||1003    | 12/3/2018 | 0.5  | 0.5*1002=501   ||0       | 12/4/2018 | 0.6  | 1003*0.6=601.8 ||0       | 12/5/208  | 0.4  | 601.8*0.4|0       | 12/6/2018 | 0.1  | 601.8*0.4*0.1  ||0       |12/7/2018  | -0.7 |601.8*0.4*0.1*-0.7|  0       |12/8/2018  | 0.2  |601.8*0.4*0.1*-0.7*0.2 0       |12/9/2018  | -0.1 |601.8*0.4*0.1*-0.7*0.2*-0.1数据已经在数据框中,我正在使用熊猫函数
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

这是正确的。+1 给他的 shift() 方法。然后,用户需求发生了变化。所以,这是我对最新要求的回答。


#import pandas for managing data with dataframe

import pandas as pd

#import tabulate to print your data frame as table

from tabulate import tabulate

#Create a data dictionary

myData={'Numbers':[1000,1002,1003,0,0,0,0,0,0],'Date':['12/1/2018','12/2/2018','12/3/2018','12/4/2018','12/5/2018','12/6/2018','12/7/2018','12/8/2018','12/9/2018'],'Mean':[1,0,0.5,0.6,0.4,0.1,-0.7,0.2,-0.1]}

#Create a data frame from the data dictionary using pandas. User mentioned that the data is already in the

#pandas data frame

myDataFrame=pd.DataFrame(myData)

#Print your final table (just pretty print)

print(tabulate(myDataFrame, headers='keys', tablefmt='psql'))

#Declare a list

MultiplicationList=[]

#Declare a constant

StorePreviousValue=0

for i in range(0,len(myDataFrame['Numbers'])):

    #If it is the first row then use the Number

    if i==0:

        #Append the value to the list

        MultiplicationList.append(myDataFrame['Numbers'][i])

    else:

        #If it is not the first row, and the value in the first column of the previous row is '0'

        #multiply Mean with the previous multiplication result

        if myDataFrame['Numbers'][i-1]==0:

            StorePreviousValue=StorePreviousValue*myDataFrame['Mean'][i]

        #If it is not the first row, and the value in the first column of the previous row is not '0'

        #(should probably say greate than '0', but the question is not clear about that), then 

        #multiply Mean with the Number in the first column of the previous row

        else:

            StorePreviousValue=myDataFrame['Numbers'][i-1]*myDataFrame['Mean'][i]

        #Append the value to the list

        MultiplicationList.append(StorePreviousValue)

#Create a new column in the data frame and pass the list as the value

myDataFrame['Multiplication']=MultiplicationList

#Print your final table (just pretty print)

print(tabulate(myDataFrame, headers='keys', tablefmt='psql'))

这是输出


+----+-----------+-----------+--------+

|    |   Numbers | Date      |   Mean |

|----+-----------+-----------+--------|

|  0 |      1000 | 12/1/2018 |    1   |

|  1 |      1002 | 12/2/2018 |    0   |

|  2 |      1003 | 12/3/2018 |    0.5 |

|  3 |         0 | 12/4/2018 |    0.6 |

|  4 |         0 | 12/5/2018 |    0.4 |

|  5 |         0 | 12/6/2018 |    0.1 |

|  6 |         0 | 12/7/2018 |   -0.7 |

|  7 |         0 | 12/8/2018 |    0.2 |

|  8 |         0 | 12/9/2018 |   -0.1 |

+----+-----------+-----------+--------+

+----+-----------+-----------+--------+------------------+

|    |   Numbers | Date      |   Mean |   Multiplication |

|----+-----------+-----------+--------+------------------|

|  0 |      1000 | 12/1/2018 |    1   |      1000        |

|  1 |      1002 | 12/2/2018 |    0   |         0        |

|  2 |      1003 | 12/3/2018 |    0.5 |       501        |

|  3 |         0 | 12/4/2018 |    0.6 |       601.8      |

|  4 |         0 | 12/5/2018 |    0.4 |       240.72     |

|  5 |         0 | 12/6/2018 |    0.1 |        24.072    |

|  6 |         0 | 12/7/2018 |   -0.7 |       -16.8504   |

|  7 |         0 | 12/8/2018 |    0.2 |        -3.37008  |

|  8 |         0 | 12/9/2018 |   -0.1 |         0.337008 |

+----+-----------+-----------+--------+------------------+

如果您没有 pandas 或 tabulate,请使用 pip install pandas pip install tabulate 进行安装


如果您不熟悉 pip,请谷歌搜索。此答案假设您知道如何从文件中读取数据并创建数据字典。如果你不这样做,那将是另一个要问的问题。


查看完整回答
反对 回复 2021-11-09
?
墨色风雨

TA贡献1853条经验 获得超6个赞

如果您使用 Pandas 数据框,则可以使用shift()方法:


df['Multiplication'] = df.Mean * df.Numbers.shift(1)

df.loc[0, 'Multiplication'] = df.Numbers[0]

for i in range(len(df[df.Numbers.shift(1) == 0])):

    df.loc[df[df.Numbers.shift(1) == 0].index, 'Multiplication'] = df[df.Numbers.shift(1) == 0].Mean.values * df[df.index.isin(df[df.Numbers.shift(1) == 0].index-1)].Multiplication.values

具有以下输出:

//img1.sycdn.imooc.com//618a6b600001456104250269.jpg

第一行你没有两个数字相乘,所以更新值是在乘法之后产生的。


现在满足零数值的要求。


正如@Raj006 所建议的那样,稍微分解一下代码:


# return just the rows that match the condition (Numbers column 0 for the row before)

df[df.Numbers.shift(1) == 0].index


# update the values for the column Multiplication with the matching rows

df.loc[df[df.Numbers.shift(1) == 0].index, 'Multiplication']


# the value to be update is the [Mean value for the matching rows] * [rows before the matching Multiplication value]

df[df.Numbers.shift(1) == 0].Mean.values * df[df.index.isin(df[df.Numbers.shift(1) == 0].index-1)].Multiplication.values

编辑:不幸的是,我不得不使用 for 循环来运行匹配行的次数,一旦计算取决于之前的计算。


查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信