如何正确地逐行调整熊猫数据框

时间:2018-08-11 13:42:47

标签: python pandas

我的数据框有两列:TimeStamp和Value(十进制)。 我想在数据框中添加3个新列: oneMinuteValue 五分钟值 fifteenMinuteValue

数据按时间戳的升序排列。从第一个时间戳开始,我要经历从第一个时间戳到最后一个时间戳的每一分钟,并执行以下操作:

对于从这一分钟开始具有数据的每一行,将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

1 个答案:

答案 0 :(得分:1)

首先在floor的预期时间之前用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
相关问题