rpe*_*ski 6 python dataframe pandas
我没有在其他地方找到答案,所以我需要问一下.可能是因为我不知道如何正确命名它.(英语不是我的原始语言)
我有大的日期时间数据框.时间在这里很重要.df中的一列具有值[Nan,1,-1].我需要执行快速计算,以便在值发生变化时进行累积和重置.
例.
Time sign desire_value
2014-01-24 05:00:00 Nan Nan
2014-01-24 06:00:00 Nan Nan
2014-01-24 07:00:00 Nan Nan
2014-01-24 08:00:00 1 1
2014-01-24 09:00:00 1 2
2014-01-24 10:00:00 1 3
2014-01-24 11:00:00 -1 1
2014-01-24 12:00:00 -1 2
2014-01-24 13:00:00 -1 3
2014-01-24 14:00:00 -1 4
2014-01-24 15:00:00 -1 5
2014-01-24 16:00:00 1 1
2014-01-24 17:00:00 1 2
2014-01-24 18:00:00 1 3
2014-01-24 19:00:00 -1 1
2014-01-24 20:00:00 -1 2
2014-01-24 21:00:00 1 1
2014-01-24 22:00:00 1 2
Run Code Online (Sandbox Code Playgroud)
我有使用函数的工作解决方案,但效率不高.
df['sign_1'] = df['sign'].shift(1)
for index, row in df.iterrows():
if row.sign is None:
df.loc[line, 'desire_value'] = None
elif row.sign == row.sign_1:
acc += 1
df.loc[index, 'desire_value'] = acc
else:
acc = 1
df.loc[index, 'desire_value'] = acc
Run Code Online (Sandbox Code Playgroud)
我找不到任何基于阵列的方法.我发现在Python中有效迭代的最好方法是使用Cython,但是有更多"Python"方法来解决这个问题吗?
Jef*_*eff 11
请看这里的最后一节
这是像groupby这样的itertools
In [86]: v = df['value'].dropna()
Run Code Online (Sandbox Code Playgroud)
石斑鱼在群断点处分开; cumsum使它有单独的组
In [87]: grouper = (v!=v.shift()).cumsum()
In [88]: grouper
Out[88]:
3 1
4 1
5 1
6 2
7 2
8 2
9 2
10 2
11 3
12 3
13 3
14 4
15 4
16 5
17 5
Name: value, dtype: int64
Run Code Online (Sandbox Code Playgroud)
然后只是一个简单的cumsum
In [89]: df.groupby(grouper)['value'].cumsum()
Out[89]:
0 NaN
1 NaN
2 NaN
3 1
4 2
5 3
6 -1
7 -2
8 -3
9 -4
10 -5
11 1
12 2
13 3
14 -1
15 -2
16 1
17 2
dtype: float64
Run Code Online (Sandbox Code Playgroud)
.abs()
如果你确实想要绝对值,你当然可以上面的.
归档时间: |
|
查看次数: |
5581 次 |
最近记录: |