通过pandas数据框中的记录迭代获得最小值

问题描述 投票:0回答:1

我创建了以下 pandas 数据框:

import pandas as pd
import numpy as np

ds = { 'trend' : [1,1,1,1,2,2,3,3,3,3,3,3,4,4,4,4,4], 'price' : [23,43,56,21,43,55,54,32,9,12,11,12,23,3,2,1,1]}

df = pd.DataFrame(data=ds)

数据框如下所示:

display(df)

    trend   price
0      1     23
1      1     43
2      1     56
3      1     21
4      2     43
5      2     55
6      3     54
7      3     32
8      3     9
9      3     12
10     3     11
11     3     12
12     4     23
13     4     3
14     4     2
15     4     1
16     4     1

我已将数据框保存到名为

df.csv
:

的 .csv 文件中
df.to_csv("df.csv", index = False)

我需要创建一个名为

minimum
的新字段,其中:

  1. 迭代数据帧的每条记录
  2. 取每次迭代中观察到的
    price
    与上一次
    price
    中观察到的最后一个
    trend
    之间的最小值。

例如:

  • 我在记录 0 处迭代,最低价格是 23(只有那个)。
  • 我在记录 1 处迭代并取 43 和 23 之间的最小值:结果是 23。

快进录制 4。

  • 我需要计算在记录 4 (
    price
    ) 处观察到的
    price: 43
    与前一个
    price
    (
    trend
    ) 观察到的最后一个
    price: 21
    之间的最小值。结果是21。

快进至记录 14。

  • 我需要计算在记录 14 (
    price
    ) 处观察到的
    price: 2
    与前一个
    price
    (
    trend
    ) 观察到的最后一个
    price: 12
    之间的最小值。结果是2。

等等。

然后我写了这段代码:

minimum = []

for i in range(len(df)):
    ds = pd.read_csv("df.csv", nrows=i+1)
    d = ds.groupby('trend', as_index=False).agg(
                                                    {'price':'last'})

    d['minimum'] = d['price'].min()
    minimum.append(d['minimum'].iloc[-1])


ds['minimum'] = minimum

生成的数据框如下所示:

显示(ds)

        trend   price   minimum
0          1     23         23
1          1     43         43
2          1     56         56
3          1     21         21
4          2     43         21
5          2     55         21
6          3     54         21
7          3     32         21
8          3      9          9
9          3     12         12
10         3     11         11
11         3     12         12
12         4     23         12
13         4      3          3
14         4      2          2
15         4      1          1
16         4      1          1

生成的数据框是正确的。

问题是我必须将此过程应用于包含大约 100 万条记录的数据框,并且需要大约 48 年才能完成。

有人知道一种更快的方法来获得上述相同的结果吗?

python pandas dataframe function group-by
1个回答
0
投票

聚合,

shift
,然后 /
map
:

prev = (df.groupby('trend')['price'].min()
          .shift(fill_value=np.inf)
        )

df['minimum'] = np.minimum(df['price'], df['trend'].map(prev))
© www.soinside.com 2019 - 2024. All rights reserved.