python - 有条件的列上的 Pandas 累积总和

标签 python pandas dataframe

我没有在别处找到答案,所以我需要问一下。可能是因为我不知道如何正确命名它。 (英语不是我的母语)

我有大型日期时间数据框。时间在这里很重要。 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

我有使用函数的有效解决方案,但效率不高。

    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

我找不到任何基于数组的方法。我发现在 Python 中高效迭代的最佳方式是使用 Cython,但是否有更多“Python”方式来解决这个问题?

最佳答案

见最后一节here

这是一个类似于 groupby 的 itertools

In [86]: v = df['value'].dropna()

石斑鱼在组断点上分开; 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

然后只是一个简单的 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

如果你确实想要绝对值,你当然可以 .abs() 以上。

关于python - 有条件的列上的 Pandas 累积总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29421356/

相关文章:

python - 如果没有 2 个线程访问同一个元素,我是否需要对 python 数组进行并发控制?

python - 如何转到下一行而不是打印\n?

python - Pygame 向各个方向射击

Python:嵌套列表合并并在同一索引中添加 int

r - 使用 R 中预先存在的名称系统地重命名列名称

python - 我可以为 requests.request 设置 max_retries 吗?

python - Python中基于pct_change对一列进行groupby和反向计算

python - 如何以正确的方式将一列分成两部分?

python - Pandas:高效插入大量行

python - "normalize"将句子的数据帧转换为更大的单词数据帧