对数据框进行迭代/切片并执行数学计算

时间:2019-12-10 07:39:18

标签: python pandas dataframe

Dataframe image

我打算执行的操作是每当第3列中有一个'2'时,我们需要获取该条目并获取该条目的第1列值,然后减去上一个条目的第1列值,然后将结果乘以常数(例如5)。  例如:从图像中,我们在6:00的第3列中有一个“ 2”,并且该条目的第1列的值为0.011333,并取前一个列1的条目为0.008583,然后执行以下操作。 (0.011333-0.008583)* 5。 我每次在数据帧的第3列中收到“ 2”时都想执行此操作。请帮忙。我无法获得执行上述操作的写代码。

3 个答案:

答案 0 :(得分:0)

这样的事情会做吗?

dataframe = [
    [1,3,6,6,7],
    [4,3,5,6,7],
    [12,3,2,6,7],
    [2,3,7,6,7],
    [9,3,5,6,7],
    [13,3,2,6,7]
]
constant = 5
list_of_outputs = []

for row in dataframe:
    if row[2] == 2:
        try:
            output = (row[0] - prev_entry) * constant
            list_of_outputs.append(output)
        except:
            print("No previous entry!")
    prev_entry = row[0]

答案 1 :(得分:0)

也许question会为您提供帮助

我以SQL的方式思考,因此基本上,您将创建一个新列,其中填充了该行上方的值。

df['column1_lagged'] = df['column 1'].shift(1)

然后您创建另一个进行计算的列

constant = 5
df['calculation'] = (df['column 1'] - df['column1_lagged'])*constant

之后,您只需将数据帧切片为您的条件(第3列为'2')

condition = df['column 3'] == 2
df[condition]

答案 2 :(得分:0)

希望这会有所帮助: 您可以使用df.shift(1)获取上一行,而使用np.where获取满足您条件的行

df = pd.DataFrame([['ABC', 1, 0, 0],
                   ['DEF', 2, 0, 0],
                   ['GHI', 3, 0, 0],
                   ['JKL', 4, 0, 2],
                   ['MNO', 5, 0, 2],
                   ['PQR', 6, 0, 2],
                   ['STU', 7, 0, 0]],
                  columns=['Date & Time', 'column 1', 'column 2', 'column 3'])

df['new'] = np.where(df['column 3'] == 2, df['column 1'] - df['column 1'].shift(1) * 5, 0)

print(df)

输出:

  Date & Time  column 1  column 2  column 3   new
0         ABC         1         0         0   0.0
1         DEF         2         0         0   0.0
2         GHI         3         0         0   0.0
3         JKL         4         0         2 -11.0
4         MNO         5         0         2 -15.0
5         PQR         6         0         2 -19.0
6         STU         7         0         0   0.0

您可以根据需要更改计算。在else部分中,您可以输入np.NaN或任何其他计算。