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

这是等式。例子


Numbers     | Date      | Mean

1000        |12/1/2018  | 1

1002        |12/2/2018  | 0

1003        |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

数据已经在数据框中,我正在使用熊猫函数


凤凰求蛊
浏览 242回答 2
2回答

慕的地10843

这是正确的。+1 给他的 shift() 方法。然后,用户需求发生了变化。所以,这是我对最新要求的回答。#import pandas for managing data with dataframeimport pandas as pd#import tabulate to print your data frame as tablefrom tabulate import tabulate#Create a data dictionarymyData={'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 framemyDataFrame=pd.DataFrame(myData)#Print your final table (just pretty print)print(tabulate(myDataFrame, headers='keys', tablefmt='psql'))#Declare a listMultiplicationList=[]#Declare a constantStorePreviousValue=0for 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 valuemyDataFrame['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,请谷歌搜索。此答案假设您知道如何从文件中读取数据并创建数据字典。如果你不这样做,那将是另一个要问的问题。

墨色风雨

如果您使用 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具有以下输出:第一行你没有两个数字相乘,所以更新值是在乘法之后产生的。现在满足零数值的要求。正如@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 rowsdf.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 循环来运行匹配行的次数,一旦计算取决于之前的计算。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python