我创建了以下 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
的新字段,其中:
price
与上一次 price
中观察到的最后一个 trend
之间的最小值。例如:
快进录制 4。
price
) 处观察到的 price: 43
与前一个 price
(trend
) 观察到的最后一个 price: 21
之间的最小值。结果是21。快进至记录 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 年才能完成。
有人知道一种更快的方法来获得上述相同的结果吗?
聚合,
shift
,然后 /map
:
prev = (df.groupby('trend')['price'].min()
.shift(fill_value=np.inf)
)
df['minimum'] = np.minimum(df['price'], df['trend'].map(prev))