gpt4 book ai didi

python - 如何正确地逐行调整 pandas 数据框

转载 作者:行者123 更新时间:2023-12-01 09:09:18 25 4
gpt4 key购买 nike

我的数据框有两列:时间戳和值(十进制)。我想在数据框中添加 3 个新列:一分钟值(value)五分钟值(value)十五分钟值

数据按时间戳升序排序。从第一个时间戳开始,我想遍历从第一个时间戳到最后一个时间戳的每一分钟,并执行以下命令:

对于包含这一分钟数据的每一行,将 oneMinuteValue 设置为:a) 前一分钟的最终值;或者b) 当前值(如果此时间戳恰好位于分钟到秒)

我希望 5 分钟和 15 分钟的专栏也有同样的效果,但我认为仅 5 分钟的示例就足够了

一个例子(十五分钟的例子):

TimeStamp             Value    OneMinuteValue    FiveMinuteValue
2018-08-11 14:30:01 5 5 5
2018-08-11 14:30:11 4.8 5 5
2018-08-11 14:30:30 4.9 5 5
2018-08-11 14:30:46 5 5 5
2018-08-11 14:30:59 5.1 5 5
2018-08-11 14:31:01 5.2 5.1 5
2018-08-11 14:31:20 5.3 5.1 5
2018-08-11 14:31:40 5.4 5.1 5
2018-08-11 14:32:16 5.5 5.4 5
2018-08-11 14:32:28 5.6 5.4 5
2018-08-11 14:33:04 5.6 5.6 5
2018-08-11 14:33:40 5.7 5.6 5
2018-08-11 14:34:01 5.7 5.7 5
2018-08-11 14:34:22 5.8 5.7 5
2018-08-11 14:34:32 5.8 5.7 5
2018-08-11 14:34:48 5.9 5.7 5
2018-08-11 14:34:59 6.0 5.7 5
2018-08-11 14:35:01 6.1 6.0 6
2018-08-11 14:35:21 6.2 6.0 6

最佳答案

首先使用 floor 创建 bool 掩码按预计时间 duplicated仅保留最后一个值。然后使用mask用于为所有没有最后一个值的值创建 NaN。这些值为 shift ed 和 NaN 被前向填充替换。最后用 Value 列的第一个值替换第一个组:

first = df.iloc[0, df.columns.get_loc('Value')]
m1 = df['TimeStamp'].dt.floor('1Min').duplicated(keep='last')
df['1min'] = df['Value'].mask(m1).shift().ffill().fillna(first)
m2 = df['TimeStamp'].dt.floor('5Min').duplicated(keep='last')
df['5min'] = df['Value'].mask(m2).shift().ffill().fillna(first)

print (df)
TimeStamp Value OneMinuteValue FiveMinuteValue 1min 5min
0 2018-08-11 14:30:01 5.0 5.0 5 5.0 5.0
1 2018-08-11 14:30:11 4.8 5.0 5 5.0 5.0
2 2018-08-11 14:30:30 4.9 5.0 5 5.0 5.0
3 2018-08-11 14:30:46 5.0 5.0 5 5.0 5.0
4 2018-08-11 14:30:59 5.1 5.0 5 5.0 5.0
5 2018-08-11 14:31:01 5.2 5.1 5 5.1 5.0
6 2018-08-11 14:31:20 5.3 5.1 5 5.1 5.0
7 2018-08-11 14:31:40 5.4 5.1 5 5.1 5.0
8 2018-08-11 14:32:16 5.5 5.4 5 5.4 5.0
9 2018-08-11 14:32:28 5.6 5.4 5 5.4 5.0
10 2018-08-11 14:33:04 5.6 5.6 5 5.6 5.0
11 2018-08-11 14:33:40 5.7 5.6 5 5.6 5.0
12 2018-08-11 14:34:01 5.7 5.7 5 5.7 5.0
13 2018-08-11 14:34:22 5.8 5.7 5 5.7 5.0
14 2018-08-11 14:34:32 5.8 5.7 5 5.7 5.0
15 2018-08-11 14:34:48 5.9 5.7 5 5.7 5.0
16 2018-08-11 14:34:59 6.0 5.7 5 5.7 5.0
17 2018-08-11 14:35:01 6.1 6.0 6 6.0 6.0
18 2018-08-11 14:35:01 6.2 6.0 5 6.0 6.0

另一种带循环的解决方案:

cols = ['1Min','5Min']
first = df.iloc[0, df.columns.get_loc('Value')]

for x in cols:
m = df['TimeStamp'].dt.floor(x).duplicated(keep='last')
df[x] = df['Value'].mask(m).shift().ffill().fillna(first)
print (df)
TimeStamp Value OneMinuteValue FiveMinuteValue 1Min 5Min
0 2018-08-11 14:30:01 5.0 5.0 5 5.0 5.0
1 2018-08-11 14:30:11 4.8 5.0 5 5.0 5.0
2 2018-08-11 14:30:30 4.9 5.0 5 5.0 5.0
3 2018-08-11 14:30:46 5.0 5.0 5 5.0 5.0
4 2018-08-11 14:30:59 5.1 5.0 5 5.0 5.0
5 2018-08-11 14:31:01 5.2 5.1 5 5.1 5.0
6 2018-08-11 14:31:20 5.3 5.1 5 5.1 5.0
7 2018-08-11 14:31:40 5.4 5.1 5 5.1 5.0
8 2018-08-11 14:32:16 5.5 5.4 5 5.4 5.0
9 2018-08-11 14:32:28 5.6 5.4 5 5.4 5.0
10 2018-08-11 14:33:04 5.6 5.6 5 5.6 5.0
11 2018-08-11 14:33:40 5.7 5.6 5 5.6 5.0
12 2018-08-11 14:34:01 5.7 5.7 5 5.7 5.0
13 2018-08-11 14:34:22 5.8 5.7 5 5.7 5.0
14 2018-08-11 14:34:32 5.8 5.7 5 5.7 5.0
15 2018-08-11 14:34:48 5.9 5.7 5 5.7 5.0
16 2018-08-11 14:34:59 6.0 5.7 5 5.7 5.0
17 2018-08-11 14:35:01 6.1 6.0 6 6.0 6.0
18 2018-08-11 14:35:01 6.2 6.0 6 6.0 6.0

关于python - 如何正确地逐行调整 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51800225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com