【发布时间】:2018-01-16 19:01:53
【问题描述】:
我有一个这样的数据框:
datetime levels shear
2016-05-01 00:10:00 100 5
2016-05-01 00:10:00 200 6
2016-05-01 00:10:00 300 10
2016-05-01 00:10:00 400 11
2016-05-01 00:20:00 100 7
2016-05-01 00:20:00 300 10
2016-05-01 00:30:00 100 5
2016-05-01 00:30:00 200 9
2016-05-01 00:30:00 300 12
2016-05-01 00:30:00 400 15
2016-05-01 00:40:00 100 19
2016-05-01 00:40:00 200 2
2016-05-01 00:40:00 300 18
这是每10分钟间隔不同高度的风切变。
我要做的是按级别对其进行分组,然后计算每个级别的连续发生剪切。所以,首先我创建另一个列,它是每个连续数据组的时间差:
data3_5['Delta'] = data3_5.sort_values(['levels','datetimes']).groupby('levels')['datetimes'].diff()
然后定义一个函数来对连续出现的相同时间差进行滚动计数:
def rolling_count(val):
if val == rolling_count.previous:
rolling_count.count +=1
else:
rolling_count.previous = val
rolling_count.count = 1
return rolling_count.count
rolling_count.count = 0 #static variable
rolling_count.previous = None #static variable
应用函数并添加新列:
data3_5['count'] = data3_5.sort_values(['levels','datetimes']).groupby('levels')['index'].diff().apply(rolling_count)
然后最后打印出结果:
group = data3_5.groupby('levels', as_index=False)
group_keys = sorted(list(group.groups.keys()))
for each in range(0,len(group_keys)):
group_result = group.get_group(group_keys[each])
print(group_result)
以下是部分结果:
datetime levels shear Delta count
2016-05-01 00:10:00 100 5 NaT 1
2016-05-01 00:20:00 100 7 00:10:00 1
2016-05-01 00:30:00 100 5 00:10:00 2
2016-05-01 00:40:00 100 19 00:10:00 3
datetime levels shear Delta count
2016-05-01 00:10:00 200 6 NaT 1
2016-05-01 00:30:00 200 9 00:20:00 1
2016-05-01 00:40:00 200 2 00:10:00 1
这不是想要的结果,因为会有两个问题: 1. 每个级别的第一次计数将被视为 NaT,因此下一个连续出现的值将被视为第一次出现。 2. 与问题1类似,200级,第三个结果应计为2。
我该如何解决这个问题?谢谢。
【问题讨论】: